分段故障线程(监视器)

时间:2016-01-08 13:22:44

标签: c segmentation-fault pthreads

#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次。

1 个答案:

答案 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作为参数来明确说明。

您的代码还存在其他问题。就像你没有初始化你正确使用的结构。或者就像你在创建每个线程后立即等待条件变量一样,并且因为在之后之后你没有发出条件变量的信号,你开始等待它,那么你将永远等待,代码将不会继续到实际调用信令功能的部分。