当我运行以下代码时,打印输出似乎不正确。
void thread_Calc(int *pos) {
printf("recieved %d\n", *pos);
sig = -1;
mandel_Calc(&slices[*pos],maxIterations,&res[(*pos)*slices[*pos].imSteps*slices[*pos].reSteps]);
counter++;
array[counter] = *pos;
sig = *pos;
}
int main(int argc, char *argv[]) {
while (WinH % nofslices != 0) { nofslices++;}
slice_height = WinH/nofslices;
level = 1;
while (1) {
for (i=0; i<nofslices; i++){
array[i] = -1;
}
y=0;
sig = -1;
counter = -1;
for(i=0; i<nofslices; i++){
printf("Passing %d\n", i);
check=pthread_create(&worker[i], NULL, (void*)thread_Calc, (void*)(int *)&i);
if (check!=0) {
printf("Error in pthread_create\n");
return 0;
}
while (sig==-1||array[counter]==-1){
}
}
}
}
(这只是我代码的一部分,所以假设每个变量都是正确的并且有一个值)。
我得到的结果是:
Passing 1
Passing 2
recieved 2
recieved 2
Passing 3
Passing 4
recieved 4
recieved 4
Passing 5
Passing 6
Passing 7
Passing 8
Passing 9
似乎我不能总是在pthread_create中传递正确的参数。
答案 0 :(得分:1)
@Andrew是对的。传递指针而不是值,因此只要在主线程中更改“i”,就会在创建的线程接收的参数中更改值。您需要创建一个副本并将其传递给线程。
答案 1 :(得分:0)
在此代码中:
for(i=0; i<nofslices; i++){
printf("Passing %d\n", i);
check=pthread_create(&worker[i], NULL, (void*)thread_Calc, (void*)(int *)&i);
每个线程启动后,i
的值会继续变化。
您传递i
的地址,因此当它在子线程中被取消引用时,它会保存您的main
线程放入其中的任何值 at那个时间。