【问题标题】:Modify variable in struct from different thread从不同的线程修改结构中的变量
【发布时间】: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


【解决方案1】:

我怀疑你的问题在这里:

activeSockets[index] = args;

这是复制结构中的数据,而不是指向它的指针。如果你在另一个线程中修改了args,那么activeSockets中的数据将不会被改变。您需要将 activeSockets 设为指针数组,而不是结构,或者将 &activeSockets[i] 传递给其他线程。

反正这是我的猜测。

【讨论】:

  • 谢谢,但我该怎么做呢?我已经编辑了代码:arg_struct *activeSockets[25]; activeSockets[index] = &args;,但现在我出现了分段错误(它只在第一次运行正常)。
  • 你必须为结构分配空间。否则,您只是使用不同的指针再次使用相同的结构。换一种方式试试:传递一个指向数组元素的指针而不是 args。
猜你喜欢
  • 2013-09-28
  • 2011-09-09
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多