[ACE程序员教程笔记]使用ACE

    技术2022-06-24  63

    ACE_Thread_Manager为ACE_Thread的高级类,使用此接口可以实现对线程进行分组管理,下面将对两个不同的业务处理采用两种不同的处理方式:一个用于回显内容,另一个用于打印内容。

    #include "stdafx.h" #include "ace/ace.h" #include "ace/Thread.h" #include "ace/Synch.h" #include "ace/Log_Msg.h" #include "ace/Thread_Manager.h" ACE_Thread_Mutex tmEchoMutex; ACE_Thread_Mutex tmPrintMutex; int g_nCounter; //子线程处理函数,在此函数中采用mutex保证每次打印三个连续的整数 //中间的输出不会被打断 static void* EchoGrpProc(void* pParam) { //如果没有mutext,输出结果将会有很大的不同,无法保证输出的完整性! tmEchoMutex.acquire(); for (int i = 0; i < 3;i++) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("EchoGrp(%t) = %d/n"),g_nCounter++)); } tmEchoMutex.release(); return NULL; } static void* PrintGrpProc(void* pParam) { //如果没有mutext,输出结果将会有很大的不同,无法保证输出的完整性! tmPrintMutex.acquire(); for (int i = 0; i < 3;i++) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("PrintGrp(%t) = %d/n"),g_nCounter++)); } tmPrintMutex.release(); return NULL; } //创建的线程个数 #define NUM_THRD 100 #define ECHO_GRP 1 #define PRINT_GRP 2 int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { ACE_thread_t* pThreadIDs = new ACE_thread_t[NUM_THRD]; ACE_hthread_t* pHandles = new ACE_hthread_t[NUM_THRD]; //启动第一组NUM_THRD/2个线程 if(ACE_Thread_Manager::instance()->spawn_n(NUM_THRD/2,(ACE_THR_FUNC)EchoGrpProc, 0,THR_NEW_LWP, ACE_DEFAULT_THREAD_PRIORITY, ECHO_GRP) == -1) { ACE_ERROR((LM_ERROR,ACE_TEXT("spawn_n error/n"))); return -1; } //启动第二组NUM_THRD/2个线程 if(ACE_Thread_Manager::instance()->spawn_n(NUM_THRD/2,(ACE_THR_FUNC)PrintGrpProc, 0,THR_NEW_LWP, ACE_DEFAULT_THREAD_PRIORITY, PRINT_GRP) == -1) { ACE_ERROR((LM_ERROR,ACE_TEXT("spawn_n error/n"))); return -1; } //等待所有的子线程处理完毕,主线程才退出 ACE_Thread_Manager::instance()->wait_grp(ECHO_GRP); ACE_Thread_Manager::instance()->wait_grp(PRINT_GRP); return 0; }

    在等待子线程时,分别对两个线程组调用wait_grp函数,此函数可以在线程组上进行等待。


    最新回复(0)