我试图创建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现在是代码,是的。 –
锁在这里绝对不是答案。答案是不共享数据。这总是比锁好,它在语义上也是正确的。 –