Linux sem_init()出现SIGSEGV

sem_init()初始化mutex报出SIGSEGV,程序异常中止

clipboard.png

在main()中sem_init(mutex,1,1);处出错,以下是源程序:

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <cstdlib>

#define BUFFER_SIZE 10//缓冲区大小为10
#define P(S) sem_wait(S)
#define V(S) sem_post(S)

char *buffer;
sem_t *mutex,*empty,*full;//三个信号量,互斥信号量mutex,技术信号量empty和full
int x,y;//生产者和消费者在buffer中下标
void output()//输出buffer数组
{
    for(int i=0;i<BUFFER_SIZE;i++)
    {
        printf("%c",buffer[i]);
        printf(" ");
    }
    printf("\n");
}
void * produce(void *pVoid)//生产者函数
{
    int j=0;
    do
    {
        P(empty);
        P(mutex);
        printf("%lu%s",pthread_self()," ——————生产—————— ");//输出当前线程的id号,以及正在执行的次数
        buffer[(x++)%BUFFER_SIZE]='A';//生产就赋值A
        output();//输出buffer
        j++;
        V(mutex);
        V(full);
    }while (j!=30);//每个线程可以做30次
}
void * consume(void *pVoid)//消费者函数
{
    int j;
    j=0;
    do
    {
        P(full);
        P(mutex);
        printf("%lu%s",pthread_self()," -----消费----- ");
        buffer[(y++)%BUFFER_SIZE]='B';//消费时,赋值为B
        output();//输出buffer值
        j++;
        V(mutex);
        V(empty);
    }while (j!=30);//每个线程可以消费30次
}

int main()
{
    int i;
    x=0;
    y=0;
    buffer=(char*)malloc(BUFFER_SIZE*sizeof(char*));
    for(i=0;i<BUFFER_SIZE;i++)//初始化buffer数组,默认为N
    {
        buffer[i]='N';
    }
    //semaphore
    sem_init(mutex,1,1);//初始化互斥信号量mutex为1
    sem_init(empty,0,BUFFER_SIZE);//初始化计数信号量empty为BUFFER_SIZE
    sem_init(full,0,0);//初始化计数信号量full为0
    //multipthread
    pthread_t tid[10];
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    //创建5个生产者线程和5个消费者线程
    for(i=0;i<5;i++)
    {
        pthread_create(&tid[i],&attr,consume,NULL);
        pthread_create(&tid[i+5],&attr,produce,NULL);
    }
//让每个线程在主线程main执行前全部执行完毕。
    for(i=0;i<10;i++)
    {
        pthread_join(tid[i],NULL);
    }
    return 0;
}

sem_init()不是要求传入一个*sem_t吗?

阅读 4.7k
3 个回答

并没有看到你的 mutex 指向任何有效的地址呐

sem_init函数入参需要传入结构体地址,即sem_t mutex;
sem_init(&mutex);

还有看到你buffer定义是数组指针,但感觉初始化是按照字符数组初始化的。

找到了原因,需要为mutex进行内存预分配,否则mutex就是个野指针

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题