0 c pthreads segmentation-fault
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#define N_ASS 4
pthread_t tid[N_ASS];
//mutex
pthread_mutex_t mutex;
//variabili condition
pthread_cond_t c_ass[N_ASS], c_pass[N_PASS];
void * checkDoc ()
{
printf("do stuff\n");
}
int main()
{
int err;
int i = 0;
for(i;i<N_ASS;i++){
err = pthread_create (&tid[i], NULL, checkDoc(), NULL);
pthread_cond_wait(&c_ass[i],&mutex);
}
for(i=0;i<N_ASS;i++)
pthread_cond_signal(&c_ass[i]);
for(i=0;i<N_ASS;i++) {
err = pthread_join(tid[i],NULL);
printf("%d joined\n",i);
}
printf("End\n");
}
Run Code Online (Sandbox Code Playgroud)
我只想说我是一个刚刚学习的小菜鸟,这是我的第一个问题,如果我必须做别的事情就告诉我,我会做的!所以这是代码,我有一个第一个问题,它使分段错误,我不知道为什么.输出是:
做什么// 1,2,3或4次
分段故障
没别的,我至少跑了20次.
你应该及彼编译器警告,如线程函数(或者更确切地说,是什么应该是线程函数)不返回任何东西.
这将导致未定义的行为,因为您没有传递指向checkDoc函数的指针pthread_create,您实际调用该checkDoc函数,并使用返回的指针作为指向线程函数的指针.由于该checkDoc函数实际上没有返回任何内容,因此您将有未定义的行为,并且很可能是崩溃.
简单的方案?不要调用该checkDoc函数:
pthread_create (&tid[i], NULL, checkDoc, NULL)
// ^^^^^^^^
// No longer calling the function
Run Code Online (Sandbox Code Playgroud)
如果你声明函数返回一个值,你应该实际执行它.如果未使用返回的值,则返回NULL.
另外,在C语言中声明一个没有任何形式参数的函数时,它与声明该函数接受任意类型的任意数量的参数是一回事.POSIX线程函数必须专门接受一个void *参数.如果你不在线程函数中使用参数,那么就不要命名参数:
void * checkDoc (void *) { ... }
Run Code Online (Sandbox Code Playgroud)
最后一点也对main函数有影响,因为C规范明确指出main函数应该接受两个参数(an int和an char *[]),或者是void.如果你有一个不带任何参数的函数,你必须通过使用voidas参数明确说明.
您的代码还存在其他问题.就像你没有初始化你正确使用的结构.或者就像你在创建每个线程后立即等待条件变量一样,并且在你开始等待它之前没有发出条件变量的信号,那么你将永远等待,代码将不会继续到你实际调用的部分信令功能.