免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2962 | 回复: 2
打印 上一主题 下一主题

线程死锁问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-26 17:44 |只看该作者 |倒序浏览
#include<sys/tpes.h>
#include<linux/sem.h>
#include<linux/shm.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<time.h>
#define MAXSHM 5  //定义缓冲区数组的下标变量个数
/*        定义3个信号量的内部标识  */
int fullid;
int emptyid;
int mutexid;
/* 主函数  */
int main()
{
    /*  定义2个共享内存的ID  */
    int arrayid;
    int getid;
    /*  定义共享内存虚拟地址  */
    int *array;
    int *get;
    /* 创建共享内存  */
    arrayid=shmget(IPC_PRIVATE,sizeof(int) *MAXSHM,IPC_CREAT|0666);
    getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);
    /*  初始化共享内存  */
    array=(int *) shmat(arrayid,0,0);
    get=(int *) shmat(getid,0,0);
    *get=0;
    /* 定义信号量数据结构 */
    struct sembuf  P,V;
    union semun arg;
    /* 创建信号量  */
    fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
    emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
    mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
    /*初始化信号量 */
    arg.val=0;            //初始时缓冲区中无数据
    if(semctl(fullid,0,SETVAL,arg)==-1)
        perror("semctl setval error");
    arg.val=MAXSHM;       //初始时缓冲区中有5个空闲的数组元素
    if(semctl(emptyid,0,SETVAL,arg)==-1)
        perror("semctl setval error");
    arg.val=1;            //初始时互斥信号为1,允许一个进程进入
    if(semctl(mutexid,0,SETVAL,arg)==-1)
        perror("semctl setval error");
    /* 初始化 P  V操作  */
    P.sem_num=0;
    P.sem_op=-1;
    P.sem_flg=SEM_UNDO;
    V.sem_num=0;
    V.sem_op=1;
    V.sem_flg=SEM_UNDO;
    /*   生产者进程  */
    if(fork()==0)
    {
        int i=0;
        int set=0;
        while(i<10)
        {
semop(emptyid,&P,1);         //对 emptyid执行P操作
            semop(mutexid,&P,1);         //对 mutexid执行 P操作
            array[set%MAXSHM]=i+1;
            printf("Producer put number %d to No.%d\n",array[set%MAXSHM],set%MAXSHM);
            set++;                       //写计数加1
            semop(mutexid,&V,1);         //对mutexid执行 V 操作
            semop(fullid,&V,1);          //对fullid执行 V 操作
            i++;
        }
        sleep(3);                    //SLEEP 3秒,等待消费者进程执行完毕
        printf("Poducer if over\n");
        exit(0);
    }
    else
    {
        /*  消费者A进程  */
        if(fork()==0)
        {
            while(1)
            {
                printf("---A:00:sleep:%d\n", *get);
                if(*get==10)
                    break;
                printf("---A:0:sleep:%d\n", *get);
                sleep(1);
                printf("---A:1:sleep\n");
                semop(fullid,&P,1);        //对fullid执行 P 操作
                printf("---A:2:sleep\n");
                semop(mutexid,&P,1);       //对mutexid执行 P 操作
                printf("---A:3:sleep\n");
                printf("The ConsumerA get number from No.%d\n",(*get)%MAXSHM);
                (*get)++;                   //读计数加1
                semop(mutexid,&V,1);        //对mutexid执行 V 操作
                semop(emptyid,&V,1);        //对fullid执行 V 操作
                sleep(1);
            }
            printf("ConsunerA is over\n");
            exit(0);
        }
        else
        {
            /*消费者B进程  */
            if(fork()==0)
            {
                while(1)
                {
                    printf("---B:00:sleep:%d\n", *get);
                    if(*get==10)
                        break;
                    sleep(1);
                    printf("---B:0:sleep:%d\n", *get);
                    printf("---B:1:sleep\n");
                    semop(fullid,&P,1);       //对fullid执行 P 操作
                    printf("---B:2:sleep\n");
                    semop(mutexid,&P,1);      //对mutexid执行 P 操作
                    printf("---B:3:sleep\n");
                    printf("The ConsumerB get number from No.%d\n",(*get)%MAXSHM);
                    (*get)++;                 //读计数加1
                    semop(mutexid,&V,1);      //对mutexid执行 V 操作
                    semop(emptyid,&V,1);      //对emptyid执行 V 操作
                    sleep(1);
                 }
                printf("ConsunerB is over\n");
                exit(0);
            }
        }
    }
    /*   父进程返回后回收3个子进程  */
    wait(0);
    wait(0);
    wait(0);
    /*  断开并撤消2个共享内存  */
    shmdt(array);
    shmctl(arrayid,IPC_RMID,0);
    shmctl(get);
    shmctl(getid,IPC_RMID,0);
    /*   撤消3个信号量集  */
    semctl(emptyid,IPC_RMID,0);
    semctl(fullid,IPC_RMID,0);
    semctl(mutexid,IPC_RMID,0);
    exit(0);
}

编译运行后,会死锁。但是如果去掉84行和110行的sleep(1)语句就不会死锁了,为什么???求大侠帮忙

论坛徽章:
0
2 [报告]
发表于 2011-10-26 17:59 |只看该作者
难道大虾都吃饭去了,在线等!!!

论坛徽章:
0
3 [报告]
发表于 2011-10-27 10:56 |只看该作者
为什么没有人回答啊5555555555555
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP