鍍金池/ 問答/C  C++  Linux/ Linux sem_init()出現(xiàn)SIGSEGV

Linux sem_init()出現(xiàn)SIGSEGV

sem_init()初始化mutex報(bào)出SIGSEGV,程序異常中止

clipboard.png

在main()中sem_init(mutex,1,1);處出錯(cuò),以下是源程序:

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

#define BUFFER_SIZE 10//緩沖區(qū)大小為10
#define P(S) sem_wait(S)
#define V(S) sem_post(S)

char *buffer;
sem_t *mutex,*empty,*full;//三個(gè)信號(hào)量,互斥信號(hào)量mutex,技術(shù)信號(hào)量empty和full
int x,y;//生產(chǎn)者和消費(fèi)者在buffer中下標(biāo)
void output()//輸出buffer數(shù)組
{
    for(int i=0;i<BUFFER_SIZE;i++)
    {
        printf("%c",buffer[i]);
        printf(" ");
    }
    printf("\n");
}
void * produce(void *pVoid)//生產(chǎn)者函數(shù)
{
    int j=0;
    do
    {
        P(empty);
        P(mutex);
        printf("%lu%s",pthread_self()," ——————生產(chǎn)—————— ");//輸出當(dāng)前線程的id號(hào),以及正在執(zhí)行的次數(shù)
        buffer[(x++)%BUFFER_SIZE]='A';//生產(chǎn)就賦值A(chǔ)
        output();//輸出buffer
        j++;
        V(mutex);
        V(full);
    }while (j!=30);//每個(gè)線程可以做30次
}
void * consume(void *pVoid)//消費(fèi)者函數(shù)
{
    int j;
    j=0;
    do
    {
        P(full);
        P(mutex);
        printf("%lu%s",pthread_self()," -----消費(fèi)----- ");
        buffer[(y++)%BUFFER_SIZE]='B';//消費(fèi)時(shí),賦值為B
        output();//輸出buffer值
        j++;
        V(mutex);
        V(empty);
    }while (j!=30);//每個(gè)線程可以消費(fèi)30次
}

int main()
{
    int i;
    x=0;
    y=0;
    buffer=(char*)malloc(BUFFER_SIZE*sizeof(char*));
    for(i=0;i<BUFFER_SIZE;i++)//初始化buffer數(shù)組,默認(rèn)為N
    {
        buffer[i]='N';
    }
    //semaphore
    sem_init(mutex,1,1);//初始化互斥信號(hào)量mutex為1
    sem_init(empty,0,BUFFER_SIZE);//初始化計(jì)數(shù)信號(hào)量empty為BUFFER_SIZE
    sem_init(full,0,0);//初始化計(jì)數(shù)信號(hào)量full為0
    //multipthread
    pthread_t tid[10];
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    //創(chuàng)建5個(gè)生產(chǎn)者線程和5個(gè)消費(fèi)者線程
    for(i=0;i<5;i++)
    {
        pthread_create(&tid[i],&attr,consume,NULL);
        pthread_create(&tid[i+5],&attr,produce,NULL);
    }
//讓每個(gè)線程在主線程main執(zhí)行前全部執(zhí)行完畢。
    for(i=0;i<10;i++)
    {
        pthread_join(tid[i],NULL);
    }
    return 0;
}

sem_init()不是要求傳入一個(gè)*sem_t嗎?

回答
編輯回答
墨小白

sem_init函數(shù)入?yún)⑿枰獋魅虢Y(jié)構(gòu)體地址,即sem_t mutex;
sem_init(&mutex);

還有看到你buffer定義是數(shù)組指針,但感覺初始化是按照字符數(shù)組初始化的。

2018年3月15日 15:12
編輯回答
北城荒

并沒有看到你的 mutex 指向任何有效的地址吶

2018年4月26日 05:26
編輯回答
疚幼

找到了原因,需要為mutex進(jìn)行內(nèi)存預(yù)分配,否則mutex就是個(gè)野指針

2018年6月2日 08:59