gpt4 book ai didi

c - 段错误线程(监视器)

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:01 29 4
gpt4 key购买 nike

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

最佳答案

您应该在此处收到编译器警告,因为线程函数(或者更确切地说,应该 是线程函数)不返回任何内容。

这将导致未定义的行为,因为您没有将指向checkDoc 函数的指针传递给pthread_create,您实际上调用 checkDoc 函数,并使用返回的指针作为线程函数的指针。由于 checkDoc 函数实际上不返回任何内容,您将有未定义的行为,很可能会发生崩溃。

简单的解决方案?不要调用 checkDoc 函数:

pthread_create (&tid[i], NULL, checkDoc, NULL)
// ^^^^^^^^
// No longer calling the function

如果您声明一个函数返回一个值,您应该实际执行它。如果不使用返回值,则返回 NULL


此外,在 C 语言中,当您声明一个没有任何形式参数的函数时,这等同于说该函数可以接受任意数量的任意类型的参数。 POSIX 线程函数必须专门接受一个 void * 参数。如果你不在线程函数中使用参数,那么就不要命名参数:

void * checkDoc (void *) { ... }

这最后一点对 main 函数也有影响,因为 C 规范明确指出 main 函数应该接受两个参数(一个 int 和一个 char *[]),或者是 void。如果您有一个不接受任何参数的函数,您必须通过使用 void 作为参数明确说明。


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

关于c - 段错误线程(监视器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34678141/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com