使用Guard同步两个线程对全局变量的访问控制,其中一个线程在递增其值时,另一个线程则在等待这个线程。守护在inc_g结束后将会释放,故在每一次调用后,另一个线程将获得Guard。 // GuardTest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "ace/Log_Msg.h" #include "ace/Thread_Mutex.h" #include "ace/Guard_T.h" #include "ace/Task.h" #include "ace/OS_NS_unistd.h" int g_n = 0; ACE_Thread_Mutex mutex; void inc_n() { //使用守护后可以实现两个线程的交互显示,一个线程在递增g_n时,另一个 //线程处于等待状态 ACE_Guard<ACE_Thread_Mutex> guard(mutex); ACE_OS::sleep(1); g_n++; ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t): g_n = %d/n"),g_n)); } void inc_mutex_error() { mutex.acquire(); ACE_OS::sleep(1); g_n++; ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t): g_n = %d/n"),g_n)); //忘记使用mutex.release(),程序将出现死锁 //mutex.release(); } //创建一个线程任务,用来递增全局变量g_n //仅仅实现了一个svc class CountThread : public ACE_Task_Base { public: virtual int svc(void) { for (int i = 0; i < 20; i++) { ::inc_n(); //如果使用下面的代码,程序仅仅打印出1-20的值,另一个线程由于mutex没有释放而一直 //处于阻塞状态! //inc_mutex_error(); } return 0; } }; int ACE_TMAIN(int argc, ACE_TCHAR* argv[]){ CountThread ct1; CountThread ct2; ct1.activate(); ct2.activate(); ct1.wait(); ct2.wait(); return 0; }