作为pthreads教程练习的一部分,我编写了一个程序来创建10个线程,而不是加入10个线程。该程序运行并打印输出,但似乎在第一次调用pthread_join时会导致分段错误。我不确定为什么会这样。我尝试在网上搜索,但是大多数关于传递给函数的无效指针的问题。我不确定这是否与我的代码存在同样的问题,因为我没有轻易看到它。
如果有人可以帮助我,我当然会很感激:)
代码如下:
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 10
void *thread_function(void *arg)
{
int i;
int *coming = (int*) arg;
for(i=0; i<5; i++)
printf("Hello, World (thread %d)\n", *coming);
return NULL;
}
int main(void)
{
int i;
void *exit_status;
int retVal;
pthread_t pthread_array[NTHREADS];
int randVals[10] = {23,5,17,55,9,47,69,12,71,37};
printf("threads are created\n");
for(i=0; i<10; i++)
{
retVal=pthread_create(&pthread_array[i], NULL, thread_function, &randVals[i]);
printf("pthread_create %d retVal=%d\n", i, retVal);
}
printf("threads are joined\n");
for(i=0; i<10; i++)
{
retVal= pthread_join(pthread_array[i], &exit_status);
printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
*((int *)exit_status));
}
printf("all threads have ended\n");
return 0;
}
答案 0 :(得分:0)
这是问题
printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
*((int *)exit_status));
你的线程函数返回NULL,因此这是存储在exit_status
中的值。所以现在在printf
你做这个
*((int *)exit_status
您正在将此NULL指针转换为int *,然后将其解除引用。取消引用NULL指针不是一个好主意。有关如何使用exit_status
What does exactly the "status" in pthread_join represent and how to query it
答案 1 :(得分:0)
*((int *)exit_status));
如果线程函数返回NULL(它确实如此),则会尝试取消引用它。在此之前,您应该测试exit_status
:
pthread_join(...);
if (exit_status != NULL)
/* Safe to use. */