免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-29 11:24 |只看该作者 |倒序浏览
/*生成信号量 */
int CreateSem()
{  

    key_t key;
    char path[80];

    memset( path,  0, sizeof( path ));

    sprintf( path, "%s/%s", getenv("HOME" ), SERVER_FILE_NAME);
    MainLog(ERR_LVL, " path [%s]", path );
    key =ftok(path,SHM_HOST_SERVER);
  
    MainLog(ERR_LVL, " key [%x]", key );
    semid=semget(key,1,IPC_CREAT|0666);  /*生成1个信号量*/
    if (semid == -1 ){  
        MainLog(ERR_LVL," create semaphore error\n" );  
        exit(-1);  
    }  
        MainLog(ERR_LVL,"semid [%d]",semid);
    /*初始化信号量*/
    semctrl_arg.val = PROCNUM;
   if( semctl(semid,0,SETVAL,semctrl_arg) < 0 )  /*为这个信号量元素赋初值1(PROCNUM)*/
   {   
      MainLog(ERR_LVL, "semctl failed \n" );
      return -1;
   }
    return 0;  
}  
  /* p 操作 */
int DecreaseSem()  
{
   if( semop( semid, &decrease,1 ) < 0 )
   {
   /*  MainLog(ERR_LVL," process [%d] p operation failed \n", getpid());*/
     return -1;
   }
     return 0;
}  
/*  v 操作 */
int IncreaseSem()
{  
   if(semop(semid,&increase,1) < 0)  
   {
    /*   MainLog(ERR_LVL," process [%d] v operation failed \n", getpid() ); */
       return -1;
   }
   return 0;
}

/*删除信号量*/
int DelSem()
{
        if(semctl(semid,0,IPC_RMID,0) < 0 ){
                MainLog(ERR_LVL,"delete sem failed!");
                return -1;

        }
        return 0;
}



//具体调用:
while(1){

if(DecreaseSem()){
    if (errno == EAGAIN)
    continue;
   exit(0);
}
   /*这段是资源的判断,里面取数据库的某条未处理的记录*/
   IncreaseSem();
   if(haveunsettled){//存在未处理的记录
      //处理.....
   }
                }
        exit(0);
      }
    }

    /*等待所有子进程结束后返回*/
    while(wait(NULL) != -1);

   DelSem();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP