pthreads create_pthread()传递多个参数

时间:2014-05-30 09:55:37

标签: c linux pointers pthreads posix

我在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]);
   ...
}

此示例显示 NOT 如何传递单个参数:

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结构的地址吗?

3 个答案:

答案 0 :(得分:2)

在第二个示例中,t是局部变量,其值正在变化。一些问题是

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

在第一种情况下,您要为传递给线程的数组中的每个线程创建单独的元素。它宣布退出该职能,因此大多数都是全球性的。

答案 1 :(得分:1)

第二个示例将相同的地址传递给每个线程,因此每个线程都会引用相同的变量,大多数人都

另外(如Rohan中的his answer所述)如果主线程在线程被传递到t的引用之前退出,则引用的内存可能会变为无效^是主线程的原型存储。

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

答案 2 :(得分:0)

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