私の4つのCPUコアで同時に4つのスレッドを作成して機能を実行しようとしています。関数iは、val
変数の値に応じていくつかのループオフセットを変更します。CreateThreadパラメータの値が予期せず変更される
私はこれを試してみましたが、それは正しくval
カウンタを増やすdoesntの、スレッドのいくつかは同じ値を報告し、ランダムに変化するようだ:
int val = 1;
threads[0] = CreateThread(0, 0, my_thread_1, &val, 0, 0);
val++;
threads[1] = CreateThread(0, 0, my_thread_1, &val, 0, 0);
val++;
threads[2] = CreateThread(0, 0, my_thread_1, &val, 0, 0);
val++;
threads[3] = CreateThread(0, 0, my_thread_1, &val, 0, 0);
しかし、これだけで正常に動作するようです:
int val1 = 1;
int val2 = 2;
int val3 = 3;
int val4 = 4;
threads[0] = CreateThread(0, 0, my_thread_1, &val1, 0, 0);
threads[1] = CreateThread(0, 0, my_thread_1, &val2, 0, 0);
threads[2] = CreateThread(0, 0, my_thread_1, &val3, 0, 0);
threads[3] = CreateThread(0, 0, my_thread_1, &val4, 0, 0);
これにはどのような原因があり、スレッドにパラメータを与えるために適切な方法はありますか?
これは私の関数である:
DWORD WINAPI my_thread_1(void *params){
int val = *(int *)params;
...
}
それにもかかわらず、に保証第2の例であります正しく機能します? – Rookie
@Rookieがコードになりました、はい。 –
ロックはここでは絶対に答えではありません。答えはデータを共有することではありません。これは常にロックに適しており、意味的には正しいことです。 –