【问题标题】:pthread with unique struct as parameter C具有唯一结构的 pthread 作为参数 C
【发布时间】:2010-04-05 01:45:11
【问题描述】:

我有这段代码给我带来了麻烦。 我知道所有线程都在读取相同的结构。但我不知道如何解决这个问题。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int a,b;
} s_param;

void *
threadfunc(void *parm)
{
  s_param *param2 = parm; 
  printf("ID:%d and v:%d\n",param2->a,param2->b);
  pthread_exit(NULL);
}

int main(int argc, char **argv)
{
  pthread_t thread[3];
  int rc=0,i;
  void * status;

  for(i=0; i<3 ; ++i){
    s_param param;
    param.b=10;
    param.a=i;
    rc = pthread_create(&thread[i], NULL, threadfunc, &param ); // !!!!
    if(rc){
      exit(1);
    }
  }  

  for(i=0; i<3 ; ++i){
    pthread_join(thread[i],&status);
  }
  return 0;
}

输出:

ID:2 and v:10
ID:2 and v:10
ID:2 and v:10

我需要什么:

ID:0 and v:10
ID:1 and v:10
ID:2 and v:10

【问题讨论】:

    标签: c parameters struct pthreads


    【解决方案1】:

    for 循环中 sparam 的范围在该循环中是静态的。当您设置 .a 和 .b 时,您会一遍又一遍地写入同一个结构,并且所有三个线程都获得指向同一个结构的指针。

    相反,您可以像这样创建一个数组来创建结构的三个单独实例......

    int main(int argc, char **argv)
    {
      pthread_t thread[3];
      s_param param[3];
      int rc=0,i;
      void * status;
    
      for(i=0; i<3 ; ++i){
        param[i].b=10;
        param[i].a=i;
        rc = pthread_create(&thread[i], NULL, threadfunc, &param[i] ); // !!!!
        if(rc){
          exit(1);
        }
      } 
    ... etc
    

    应该提到,在这样的数组中创建结构(和线程)是唯一可行的,因为您显然对主线程执行了 join()。如果你没有做那个连接,你会被建议要么在主函数之外静态分配结构,要么从堆中分配它们,因为一旦入口线程退出主函数,包含数组的堆栈帧将变为无效并且很快会以不可预知的方式被覆盖。

    【讨论】:

      【解决方案2】:

      param 在执行main 函数期间位于堆栈中的同一位置。每次您设置新值时,它们都会清除旧值,并且所有threadfuncs 都在查看内存中的同一个位置。 malloc 结构,或者从不同的内存位置创建它们。 (另外,为跨线程数据结构使用栈内存是令人担忧的;一旦你设置它们的函数退出,内存就无效了。)

      【讨论】:

        【解决方案3】:

        param 是一个局部变量。它在循环大括号的末尾超出范围。您需要为每个线程malloc 一个新的s_param

        或者更好的是,定义一个包含pthread_ts_param 的结构并将该类型用于thread[3]

        typedef struct {
          int a,b;
          pthread_t t;
        } s_param;
        
        int main(int argc, char **argv)
        {
          s_param thread[3]; // declare threads + params together
          int rc=0,i;
          void * status;
        
          for(i=0; i<3 ; ++i){
            s_param *param = &thread[i]; // no persistent data declared here
            param->b=10;
            param->a=i;
            rc = pthread_create(&thread[i].t, NULL, threadfunc, &thread[i] ); // !!!!
            if(rc){
              exit(1);
            }
          }  
        …
        

        【讨论】:

        • s_param *param = thread[i]; 应该是s_param *param = &amp;thread[i];
        猜你喜欢
        • 2013-03-29
        • 2019-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多