【发布时间】:2014-01-10 17:03:04
【问题描述】:
我有两个线程。 一种是创建结构并用数据填充它:
int main(int argc, char *argv[]) {
struct arg_struct args;
args.remoteSockfd = remoteSockfd;
/*...*/
args.active = 1;
然后我将它添加到数组中:
while(activeSockets[index].active!=0){
index++;
}
activeSockets[index] = args;
并创建新线程:
(void) pthread_create(&serverThread, NULL, threadBody, &args);
}
在第二个线程中我有:
void *threadBody(void *args) {
/*...*/
arg_struct *foo = (arg_struct*) (args);
}
所以现在我可以访问结构中的变量了:
sockfd = foo->remoteSockfd;
但是当我尝试修改它们时:
foo->active=0;
它不会在第一个线程中更改变量。如何从另一个线程修改第一个线程中的结构?
【问题讨论】:
-
这将需要您的全部代码,而不仅仅是部分代码。
-
如果其他地方没有错误...您是否尝试简单地将
active声明为volatile? -
我认为你需要阅读一本关于多线程的教科书,特别是锁定和跨线程内存一致性。 (如果您对kernel.org/doc/Documentation/memory-barriers.txt 的反应是“是的,是的,我知道这一切”,请忽略此评论。)
-
在没有适当同步的情况下在线程之间修补变量是绝对不行的。这似乎是简单的出路,但如果你不知道自己在做什么,那一切都会以泪水告终。最好花时间学习并行进程同步,而不是尝试修复概念上损坏的代码。
-
我想我可以在不同步的情况下做到这一点,因为只有一个线程“可以”更改该变量然后结束,并且只有一个线程读取它(当然你不知道这一点)。那里的眼泪只是由于我缺乏C和英语知识造成的。 volatile 也没有效果。它会产生警告:
passing argument 4 of ‘pthread_create’ discards ‘volatile’ qualifier from pointer target type
标签: c multithreading