免费注册 查看新帖 |

Chinaunix

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

高手来看一下,我这段信号量控制并发的代码为什么会产生死锁?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-29 11:24 |只看该作者 |倒序浏览
/*生成信号量 */\r\nint CreateSem()\r\n{  \r\n\r\n    key_t key;\r\n    char path[80];\r\n\r\n    memset( path,  0, sizeof( path ));\r\n\r\n    sprintf( path, \"%s/%s\", getenv(\"HOME\" ), SERVER_FILE_NAME);\r\n    MainLog(ERR_LVL, \" path [%s]\", path );\r\n    key =ftok(path,SHM_HOST_SERVER); \r\n  \r\n    MainLog(ERR_LVL, \" key [%x]\", key );\r\n    semid=semget(key,1,IPC_CREAT|0666);  /*生成1个信号量*/\r\n    if (semid == -1 ){  \r\n        MainLog(ERR_LVL,\" create semaphore error\\n\" );  \r\n        exit(-1);  \r\n    }  \r\n        MainLog(ERR_LVL,\"semid [%d]\",semid);\r\n    /*初始化信号量*/\r\n    semctrl_arg.val = PROCNUM; \r\n   if( semctl(semid,0,SETVAL,semctrl_arg) < 0 )  /*为这个信号量元素赋初值1(PROCNUM)*/\r\n   {   \r\n      MainLog(ERR_LVL, \"semctl failed \\n\" );\r\n      return -1;\r\n   }\r\n    return 0;  \r\n}  \r\n  /* p 操作 */\r\nint DecreaseSem()  \r\n{\r\n   if( semop( semid, &decrease,1 ) < 0 )\r\n   {\r\n   /*  MainLog(ERR_LVL,\" process [%d] p operation failed \\n\", getpid());*/\r\n     return -1;\r\n   }\r\n     return 0;\r\n}  \r\n/*  v 操作 */\r\nint IncreaseSem()\r\n{  \r\n   if(semop(semid,&increase,1) < 0)  \r\n   {\r\n    /*   MainLog(ERR_LVL,\" process [%d] v operation failed \\n\", getpid() ); */\r\n       return -1;\r\n   }\r\n   return 0;\r\n} \r\n\r\n/*删除信号量*/\r\nint DelSem()\r\n{\r\n        if(semctl(semid,0,IPC_RMID,0) < 0 ){\r\n                MainLog(ERR_LVL,\"delete sem failed!\");\r\n                return -1;\r\n\r\n        }\r\n        return 0;\r\n}\r\n\r\n\r\n\r\n//具体调用:\r\nwhile(1){\r\n\r\nif(DecreaseSem()){\r\n    if (errno == EAGAIN)\r\n    continue;\r\n   exit(0);\r\n}\r\n   /*这段是资源的判断,里面取数据库的某条未处理的记录*/\r\n   IncreaseSem();\r\n   if(haveunsettled){//存在未处理的记录\r\n      //处理.....\r\n   }\r\n                }\r\n        exit(0);\r\n      }\r\n    }\r\n\r\n    /*等待所有子进程结束后返回*/\r\n    while(wait(NULL) != -1);\r\n\r\n   DelSem();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP