首页 > 解决方案 > 为什么我的 pthread_t 指针数组会导致 pthread_create 出现段错误,但对数组中 pthread_t 的引用却没有

问题描述

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

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

标签: carrayspointerspthreads

解决方案


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

pthread_t* tThreads[nThreads]相比之下,您定义了一个指向 -objects 的指针数组,而不是-objectspthread_t本身pthread_t。传递这样一个(未初始化的)指针(指向“某处”但不指向有效的pthread_t对象)pthread_create将产生未定义的行为(例如段错误)。tThreads[i] = malloc(sizeof(pthread_t))每次通话之前您都需要一个。


推荐阅读