随笔 - 79  文章 - 58  trackbacks - 0
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(9)

随笔分类

随笔档案

文章档案

相册

搜索

  •  

积分与排名

  • 积分 - 294076
  • 排名 - 87

最新评论

阅读排行榜

评论排行榜

一般进程间互斥都是用信号量之类的,但信号量资源有限制,而且速度也不佳.

有的时候用共享内存作为锁介质,使用原子比较替换的方式,速度快,又没有限制.

但共享内存有个坏处,进程退出时不会自动释放锁资源.

原子比较替换时应该替换为进程ID, 其他进程加锁时可以判断加锁进程是否存在,

如果不存在则替换为本进程ID.

AIX下的实现:

int lock(int* lockv)
{
   while(1)
   {
      if(*lockv == 0)
      {
         if(check_lock(*lockv, 0, getpid()) == 0)
         {
            return 0;
         }
      }
      else
      {
         int tmp = *lockv;
         kill(tmp, 0);
         if(errno == ESRCH)
         {
            if(check_lock(*lockv, tmp, getpid()) == 0)
            {
               return 0;
            }            
         }
         usleep(10);
      }
}
posted on 2008-07-15 21:23 merlinfang 阅读(1461) 评论(3)  编辑 收藏 引用

FeedBack:
# re: 原子比较替换锁 2008-07-16 03:03 放屁阿狗
进程间互斥的方法太多了flock,socket ,ipcmsg.....  回复  更多评论
  
# re: 原子比较替换锁[未登录] 2008-07-16 09:36 raof01
还有内核里的spinlock  回复  更多评论
  
# re: 原子比较替换锁[未登录] 2008-07-16 09:51 ViskerWong
spinlock太重量级了,不在非必要的情况下尽量少用
Vista已经开始减少spinlock的使用量了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理