现在的位置: 首页 > 综合 > 正文

实现函数级的并发控制(一)

2013年01月10日 ⁄ 综合 ⁄ 共 988字 ⁄ 字号 评论关闭
问题提出:
        在并发访问的时候,允许并发访问函数A,但是当访问函数A时不允许访问函数B,同样访问函数B时不能函数A,即两个函数之间是互斥的.如何才能获得访问A时的最大性能呢?

解决方案(1):
       假设多进程环境下,一般选用PID作为可重入的重要条件,传统实现如下:
       void lockpid(lock* p)
      {
             if(p->pid == getpid())
                   return;
             else
            {
                  p->lock();
            }
      }
      本题解决也是借鉴如此,使用整数 lockv = 0;作为两函数互斥的根本,当lockv>0时表示正在访问函数A,<0时表示正在访问函数B.具体实现如下:
      函数A()
      {
            //临界区
           {
                  while(lockv < 0)
                        usleep(1);
                  ++lockv;

            }
            
            //do something ...

           //临界区
           {
                  --lockv;
            }       
       }
       
      函数B()
      {
            //临界区
           {
                  while(lockv > 0)
                        usleep(1);
                  --lockv;

            }
            
            //do something ...

           //临界区
           {
                  ++lockv;
            }       
       }

      缺点很明显的,虽然在临界区里面只有几个机器指令,但并不能获得最大的性能.如何优化才能获得函数A的最大性能呢?
 

抱歉!评论已关闭.