sem_init()初始化mutex报出SIGSEGV,程序异常中止
在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吗?
并没有看到你的 mutex 指向任何有效的地址呐