我在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
结构的地址吗?
答案 0 :(得分:2)
在第二个示例中,t
是局部变量,其值正在变化。一些问题是
t
的地址,则此功能终止后该地址可能无效。t
的地址时,每个线程将获得相同的地址,并将尝试访问/修改相同的变量,从而导致竞争条件。t
在循环中发生变化,并且您传递地址时,同一个线程将看到t
的不同值。在第一种情况下,您要为传递给线程的数组中的每个线程创建单独的元素。它宣布退出该职能,因此大多数都是全球性的。
答案 1 :(得分:1)
第二个示例将相同的地址传递给每个线程,因此每个线程都会引用相同的变量,大多数人都
。另外(如Rohan中的his answer所述)如果主线程在线程被传递到t
的引用之前退出,则引用的内存可能会变为无效^是主线程的原型存储。
第一个示例为每个线程传递一个不同的地址,因此每个线程都会引用一个不同的变量。
答案 2 :(得分:0)
您正在for循环中创建线程并通过传递t的地址来共享相同的全局变量。 t的值可以被其他线程修改。