回 帖 发 新 帖 刷新版面

主题:[讨论]求救:LINUX下C语言并发计算程序,提示段错误???

编的一个并发运算程序在LINUX运行提示段错误,不知道是哪里错了,请大家给看看:
这个是计算  ((10+20)/(6-1)+(100-50)*10)/10=?
使用P V信号灯
程序如下:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
//#include <sys/ipc.h>
//#include <sys/sem.h>
#include <linux/sem.h>
#include <errno.h>
#define SEMKEY 301
#define MUTEX

int semid;
int res;
float a,b,c,d,e,f,g;

void p(int id,int semno)
{
#ifdef MUTEX    
struct sembuf sop;
sop.sem_num = semno;
sop.sem_op = -1;
sop.sem_flg = 0;
semop(id,&sop,1);
//printf("%d pass\n",getpid()); 
#endif
}

void v(int id,int semno)
{
#ifdef MUTEX    
struct sembuf sop;
sop.sem_num = semno;
sop.sem_op = 1;
sop.sem_flg = 0;
semop(id,&sop,1);
#endif
}

p1()
{
a=10+20;
v(semid,0);
}

p2()
{b=6-1;
v(semid,1);
}

p3()
{p(semid,0);
p(semid,1);
c=a/b;
v(semid,2);
}

p4()
{d=100-50;
v(semid,3);
}

p5()
{p(semid,3);
e=d/10;
v(semid,4);
}

p6()
{p(semid,2);
p(semid,4);
f=d+e;
v(semid,5);
}

p7()
{p(semid,5);
g=f/10;
}

main()
{
    int i;
    pthread_t  p1,p2,p3,p4,p5,p6,p7;
    union semun semopts;
   a=b=c=d=e=f=g=0;
    
    semid = semget(IPC_PRIVATE,6,IPC_CREAT|IPC_EXCL|0666);
    if (semid<0){
        printf("%s\n",strerror(errno));
        return;
    }
    semopts.val = 1;
    res = semctl(semid,0,SETVAL,semopts);
    if (res<0) {
       printf("res=%d\n",res);
        return;
    }
        
    pthread_create(&p1,NULL,p1,NULL);
    pthread_create(&p2,NULL,p2,NULL);
   pthread_create(&p3,NULL,p3,NULL);
   pthread_create(&p4,NULL,p4,NULL);
    pthread_create(&p5,NULL,p5,NULL);
   pthread_create(&p6,NULL,p6,NULL);
   pthread_create(&p7,NULL,p7,NULL);

   printf("结果为%d\n",g);

   pthread_join(p1,NULL);
    pthread_join(p2,NULL);
   pthread_join(p3,NULL);
    pthread_join(p4,NULL);
   pthread_join(p5,NULL);
    pthread_join(p6,NULL);
   pthread_join(p7,NULL);
     
   semctl(semid,0,IPC_RMID,0);
}

回复列表 (共2个回复)

沙发

段错误一般是指针出错,
空指针吧

板凳

问题解决了,谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册