我試圖創建4個線程同時在我的4個CPU內核運行一個函數。我調用的函數將根據val
變量值更改一些循環偏移量。CreateThread參數值意外改變
我想這一點,但它不恰當地增加val
櫃檯,一些線程的報告相同的價值觀,似乎隨意改變:
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;
...
}
不過,是保證第二個例子好好工作? – Rookie
@Rookie現在是代碼,是的。 –
鎖在這裏絕對不是答案。答案是不共享數據。這總是比鎖好,它在語義上也是正確的。 –