ACE中的条件变量学习心得

    技术2024-12-07  22

    ACE的线程同步的方法之一是使用条件变量,我原来对条件变量不大理解,主要原因是Windows

     

    操作系统下并没有直接与之对应的内核对象,而且条件变量需要和Mutex共同使用,

     

    这个让人一下子摸不着头脑。经过反复测试,又查看了ACE的源代码,

     

    我终于理解条件变量为什么总是与Mutex混合使用了。

     

    像以下这段示例代码:

     

    intHA_CommandHandler::svc (void){  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%t) Handler Thread running/n")));

      for (int i = 0; i < NUM_USES; i++)    {      this->mutex_.acquire ();      while (!this->rep_.is_free ())      {          ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%t) Thread begin wait/n")));          this->waitCond_.wait ();      }      this->rep_.set_owner (this);      this->mutex_.release ();

          this->rep_.update_device (i);

          ACE_ASSERT (this->rep_.is_owner (this));      this->rep_.set_owner (0);

          this->waitCond_.signal ();    }

      return 0;}

     

    对于多个线程使用条件变量的情况,在做wait操作时,实际上函数内部会先对this->mutex_

     

    调用release操作,然后调用WaitforSingleObject等待一个信标(在Windows下这样处理),

     

    当信标信号释放触发WaitforSingleObject,等待结束,然后wait在内部再调用this->mutex_

     

    的acquire方法,继续用互斥体锁定。

     

    这样设计的好处是,在线程挂起等待时,不占用互斥体资源,可以改善线程的并发执行效率。

    最新回复(0)