为什么我的pthread_t指针数组在pthread_create上导致segfault,但对数组中的pthread_t的引用却不

时间:2019-01-25 23:50:48

标签: c arrays pointers pthreads

我想将pthread_t存储在这样的数组中:

pthread_t tThreads[nThreads];

不久之后,我使用for循环遍历数组以启动线程

pthread_create( &tThreads[i], NULL, &fn, (void*) NULL);

我注意到我正在使用pthread_t对象在特定索引处创建pthread_t的数组,然后传递对该pthread_t的引用以启动线程。为了变得聪明并减少冗长,我将tThreads更改为一组pthread_t引用

pthread_t* tThreads[nThreads];

这样我就可以像这样创建线程

pthread_create( tThreads[i], NULL, &fn, (void*) NULL);

问题在于,第二种方法在尝试创建pthread时会产生段错误。 是什么原因造成的?

1 个答案:

答案 0 :(得分:2)

使用pthread_t tThreads[nThreads],您可以定义一个直接包含pthread_t对象的数组。您可以将每个有效对象的(地址)传递给pthread_create

相反,使用pthread_t* tThreads[nThreads],您可以为pthread_t对象定义一个 pointers 数组,而不是pthread_t对象本身。 将此类(未初始化的)指针(指向“某处”但未指向有效的pthread_t对象)传递到pthread_create将产生未定义的行为(例如,段错误)。您每次通话前都需要tThreads[i] = malloc(sizeof(pthread_t))