#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");
}
我只是想说我是一个刚刚学习的小菜鸟,这是我的第一个问题,如果我必须做别的事情就告诉我,我会做的! 所以这是代码,我有一个第一个问题,它使分段错误,我不知道为什么。 输出是:
做东西// 1,2,3或4次
分段错误
别的,我至少跑了20次。
答案 0 :(得分:5)
你应该在这里获得编译器警告,因为线程函数(或者更确切地说假设是线程函数)不会返回任何内容。
这将导致未定义的行为,因为您没有将pthread_create
函数的指针传递给checkDoc
,实际上调用 checkDoc
函数,并使用返回的指针作为线程函数的指针。由于checkDoc
函数实际上没有返回任何内容,因此您将有未定义的行为,并且很可能是崩溃。
简单的解决方案?不要调用 pthread_create (&tid[i], NULL, checkDoc, NULL)
// ^^^^^^^^
// No longer calling the function
函数:
NULL
如果你声明函数返回一个值,你应该实际执行它。如果未使用返回值,则只返回void *
。
此外,在C中声明一个没有任何形式参数的函数时,它与声明该函数接受任意类型的任意数量的参数是一回事。 POSIX线程函数必须专门接受void * checkDoc (void *) { ... }
参数。如果你不在线程函数中使用参数,那么就不要命名参数:
main
最后一位也对main
函数有影响,因为C规范明确指出int
函数应该采用两个参数(char *[]
和{{1} }),或void
。如果你有一个不带任何参数的函数,那么必须通过使用void
作为参数来明确说明。
您的代码还存在其他问题。就像你没有初始化你正确使用的结构。或者就像你在创建每个线程后立即等待条件变量一样,并且因为在之后之后你没有发出条件变量的信号,你开始等待它,那么你将永远等待,代码将不会继续到实际调用信令功能的部分。