【问题标题】:pthreads create_pthread() passing multiple argumentspthreads create_pthread() 传递多个参数
【发布时间】:2014-05-30 09:55:36
【问题描述】:

我正在关注这个关于 pthreads 的教程:

https://computing.llnl.gov/tutorials/pthreads/#Abstract

还有一个通过结构体传递多个参数的例子:

struct thread_data{
   int  thread_id;
   int  sum;
   char *message;
};

struct thread_data thread_data_array[NUM_THREADS];

int main (int argc, char *argv[])
{
   ...
   thread_data_array[t].thread_id = t;
   thread_data_array[t].sum = sum;
   thread_data_array[t].message = messages[t];
   rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &thread_data_array[t]);
   ...
}

这个例子展示了如何传递单个参数:

int rc;
long t;

for(t=0; t<NUM_THREADS; t++) 
{
   printf("Creating thread %ld\n", t);
   rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
   ...
}

我不明白为什么最后一个场景是错误的,因为它传递了t的地址。但是第一种情况不是通过thread_data 结构的地址吗?

【问题讨论】:

    标签: c linux pointers pthreads posix


    【解决方案1】:

    在第二个例子中,t 是局部变量,它的值在变化。有些问题是

    • 如果您传递t 的地址,则该地址在此函数终止后可能无效。
    • 当您传递t 的地址时,每个线程将获得相同的地址并尝试访问/修改相同的变量,从而产生竞争条件。
    • 由于t 在循环中发生变化,并且您正在传递地址,同一线程将看到t 的不同值。

    在第一种情况下,您正在为传递给线程的数组中的每个线程创建单独的元素。并且它声明在函数之外,所以大部分都是全局的。

    【讨论】:

      【解决方案2】:

      第二个示例将相同地址传递给每个线程,因此每个线程将引用相同的变量,这很可能不是人们想要的。

      另外(正如Rohanhis answer 中提到的)如果主线程在一个线程被传递给t 之前退出,则引用的内存可能会变得无效,因为`t ^ 是对主线程。

      第一个示例将不同的地址传递给每个线程,因此每个线程将引用不同的变量。

      【讨论】:

        【解决方案3】:

        您正在 for 循环中创建线程并通过传递 t 的地址来共享相同的全局变量。 t的值可以被其他线程修改。

        【讨论】:

          猜你喜欢
          • 2014-10-27
          • 1970-01-01
          • 1970-01-01
          • 2014-06-02
          • 2012-08-13
          • 2016-02-03
          • 2018-10-12
          • 2021-09-12
          • 2014-06-04
          相关资源
          最近更新 更多