我在评论中指出了这一点,但值得放大。
你的returnVal
用法不对
pthread_join
api 需要 a void**
,即指向 a 的指针void*
。与 不同void*
,avoid**
不是同样普遍的。它是一个特定类型的指针,因此您应该只传递一个类似类型的地址。但是,无论如何您都没有使用它,所以我现在建议您只需传递 NULL。正如所写,它是未定义的行为。而且我可以向你保证sizeof(char)
,你给它的地址的可写大小和sizeof(void*)
它期望可用的大小是不一样的。现在考虑这个:
pthread_join(aThread[i], NULL);
如果您想知道该void**
参数的用途是什么,它是一个存储 void*
线程进程返回值的地方。回想一下 pthread thread-proc 看起来像这样:
void* thread_proc(void* args)
// ^----- this is what is stashed in the pthread_join second parameter
你失败测试的逻辑是倒退的
pthread_join
函数成功返回0
;_ 不是失败。
你实际上并没有运行并发线程
线程并发仅仅意味着您的线程同时运行。但你的没有。您启动一个线程,然后等待它结束,然后启动一个线程,然后等待它结束,等等。这实际上并不比简单地调用一个函数更好(实际上,实际上更糟)。如果你想让你的线程同时运行,你的逻辑应该是这样的:
pthread_t aThread[MAX_LENGTH];
int errCode[MAX_LENGTH] = {0};
for (int i = 0; i < MAX_LENGTH; i++)
{
if((errCode[i] = pthread_create(&aThread[i], NULL, &findMatch, &fpArgs)) != 0)
printf("error creating thread %d, error=%d\n", i, errCode[i]);
}
for (int i = 0; i < MAX_LENGTH; i++)
{
// note the check for errCode[i], which is only non-zero
// if the i'th thread failed to start
if(errCode[i] == 0)
{
errCode[i] = pthread_join(aThread[i], NULL))
if (errCode[i] != 0)
printf("error joining thread %d, error=%d\n", i, errCode[i]);
}
}