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方法,继续用互斥体锁定。
这样设计的好处是,在线程挂起等待时,不占用互斥体资源,可以改善线程的并发执行效率。