gpt4 book ai didi

c - Pthread 参数

转载 作者:行者123 更新时间:2023-12-04 10:14:34 25 4
gpt4 key购买 nike

我在将参数传递给新线程时遇到问题,我有以下问题

 doRowOffset[0] = 0;
for(threads = 1; threads < NUMTHREADS; threads++){
doRowOffset[threads] = threads;
printf("Do row: %d\n", doRowOffset[threads]);
pthread_create(&threadHandler[threads], NULL, multiplyRows, (void *) &doRowOffset[threads]);
}

void * multiplyRows(void * dealWithRows){
int offset = *((int *) dealWithRows);
printf("%d\n", *((int *) dealWithRows));
printf("Offset: %d\n", offset);
printf("Size: %d\n", partitionSize/NUMTHREADS);
printf("Calculated Offset: %d\n", offset*partitionSize/NUMTHREADS);
...

现在我希望看到下面的输出

做行:1
1
偏移量:1
尺码:2
计算出的偏移量:2

但是,当我进入线程时,对于 dealWithRows,我总是得到垃圾值或 0,我是不是在参数传递方面做错了什么?

最佳答案

如果你传递一个正在改变的变量的地址,你必须预料到它可能会改变你:-)

可能发生的情况是您将 doRowOffset 设置为 1(例如)然后启动线程。在该线程启动并取消引用其指针之前,您为下一个线程更改 doRowOffset

然后当第一个线程最终取消引用该地址时,您已经更改了基础值。

有两种方法可以处理这个问题。第一个是同步主线程和子线程,让主线程一直等到子线程取消引用变量并将值存储在本地。只有这样,主线程才会为即将启动的下一个线程更改变量。然而,这种做法违背了线程的目的 :-)

另一种是将实际的整数值(不是地址)转换为空指针,传递给线程函数。这意味着值将被复制到线程函数的堆栈而不是地址,这样主线程将无法影响它。

类似于:

pthread_create (&threadHandler[threads], NULL, multiplyRows,
(void *) doRowOffset); // <<-- Note, removed the '&'.

在主线程中:

int offset = (int) dealWithRows;

在子线程中。

关于c - Pthread 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com