我想将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时会产生段错误。 是什么原因造成的?
答案 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))
。