私はstd :: async(またはstd :: thread)インプレースを使用して文字列を反転しようとしていますが、正常なアルゴリズムを見つけることができませんでした。簡単にするためstd :: asyncを使用してインプレース文字列を逆順
void reverse(char* x, char* y)
{
while (x < y)
{
char temp = *x;
*x = *y;
*y = temp;
x++;
y--;
}
}
int main(int argc, char** argv)
{
int numthreads = 2;
char input[] = "abcdef";
size_t size = strlen(input);
size_t substrsize = 0;
substrsize = size/numthreads;
char* end = &input[strlen(input) - 1];
char* begin = &(input[size-substrsize]);
for (int i = 0; i < numthreads; i++)
{
std::async(std::launch::async, reverse, begin, end);
end = begin -1;
begin = begin-substrsize;
}
cout << input << endl;
return 0;
}
、Iは、入力が等しい大きさのサブストリングに分割することができると仮定している(すなわち、サイズ%NumThreadsにはゼロとする)
をしかし、上記で、Iは出力に何を得ます次のとおりです。
cbafed
この出力は、abcとdefが逆転しているためわかります。しかし、正しい出力はfedcbaになります。
希望の出力を得るためにこのコードを拡張することはできますか?返された未来をベクトルで(移動して)保存してから呼び出すようにしましたが、役に立たなかった(おそらく関数がvoidを返すため)。
正しく動作させるためにヒントや示唆を与えてください。 多くの感謝!
非同期なしで試しましたか? – GManNickG
@ GManNickG std :: threadの配列を試しましたが、同じ結果が得られます。 – user2930006
私は、彼がスレッドをチャックして、あなたのコードが逐次実行されるのを見ることを意味すると思う。さらに、「デバッガでコードを実行し、スレッドなしで動作するまでコードを微調整してください。いったん動作したら、スレッドを追加して、スレッドが同時にmutexやその他のものを追加するまで破壊を防ぐように。 – user4581301