【问题标题】:Posix thread arguments issue ( C )Posix 线程参数问题(C)
【发布时间】:2013-11-07 23:19:48
【问题描述】:

我在使用 C 时遇到了一些麻烦。我是一个相对较新的程序员,我正在尝试创建一个结构并通过引用将其传递给两个线程。我希望一个线程将信息放入结构中,另一个线程添加信息并将其打印出来。我正在谈论的伪代码如下:

typedef struct{ int x, y }addme;
main{
  addme argstopass;
  create_thread(method_store, (void*)&argstopass);
  create_thread(method_calc, (void*)&argstopass);
  //Code to tell store thread 'only' to run
  //Code to tell calc thread to run when store is finished.
  join_both_threads;
}

void method_store(void* args){
  addme info = *((addme*)args);
  info.a = 7;
  info.b = 3;
}  

void method_calc(void* args){
  addme info = *((addme*)args);
  print(info.a+info.b);
}

问题是,当我尝试添加信息时,就像 store 方法从未更新过它一样。传递给线程的引用是相同的,所以我不明白为什么只要它们都有指向它的指针,它们就不能访问相同的信息。

希望这里有人能告诉我我做错了什么。如果有任何不清楚的地方,请发表评论,我会帮助澄清。

【问题讨论】:

    标签: c multithreading struct pthreads


    【解决方案1】:
    addme info = *((addme*)args);
    

    在堆栈上创建一个语言环境变量并将argstopass 的内容复制到其中。修改只发生在这个局部变量上,因此不会被第二个线程看到。

    使用

    addme *info = args;
    info->a = 7;
    

    第二个线程也是如此。您必须确保第二个线程使用它的 printf() 等待,直到第一个线程修改了值。

    【讨论】:

      【解决方案2】:
      void method_store(void* args){
        addme info = *((addme*)args);
        info.a = 7;
        info.b = 3;
      }  
      

      此方法创建结构字段的本地副本,更新该本地副本,然后返回,销毁副本并且不对主结构做任何事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        相关资源
        最近更新 更多