一種實用的c++線程管理方式

         線程是我們編程中使用非常頻繁的操作。線程本身難度不大,但實際使用中往往棘手,特別是在大量使用中,會遇到線程間同步、關閉釋放、跨線程通訊、啓動大量線程時耗時等問題。同時多處使用還會產生大量的冗餘代碼。下面實現一個靜態庫來解決線程使用中遇到的問題。

         使用時需要載入JCThreadManager.h頭文件和引入JCThreadManager.lib。使用過程很簡單:1.通過JCThreadManager類創建對象         2.初始化InitManager(線程函數,參數,立刻啓動,鎖名稱)。下面是使用的例子:

         int _tmain(int argc, _TCHAR* argv[])

{

         JCThreadManager jc0,jc1,jc2,jc3;

         //jc0 jc1輸出順序混亂

         jc0.InitManager(TestThreadProc0,"test0");

         jc1.InitManager(TestThreadProc1,"test1",false);

         jc1.Start();//手動啓動

         Sleep(2000);

         jc0.End();//結束線程,IsClose()返回true

         jc1.End();

         jc1.WaitForClose(2000);

         jc0.WaitForClose();//等待結束,默認是INFINITE

 

 

         getchar();

         //jc2 jc3輸出順序正常

         jc2.InitManager(TestThreadProc2,"test2",true,"testlock");

         jc3.InitManager(TestThreadProc3,"test3",true,"testlock");

         Sleep(2000);

         //jc2 jc3程序退出自動關閉

         return 0;

}

1.首先創建對象:JCThreadManager jc0;

2.初始化線程: jc0.InitManager(TestThreadProc0,"test0");其中TestThreadProc0是線程名稱,test0是參數

3.關閉可以根據需要通過End()或者程序結束後自動關閉,使用End()通知線程處於關閉狀態,這時線程中IsClose()得到通知,判斷時true時就可以return安全退出線程。WaitForClose()是等待關閉的阻塞方法。

4.如果要進行線程同步可以使用鎖,InitManager初始化時根據鎖名稱進行同步。第三個參數是true會直接運行線程,是false需要調用Start()運行。

 

下面是線程函數定義:

DWORD WINAPI TestThreadProc0(JCThreadManager* pThreadManager)

{

         char buf[256]={0};

         sprintf(buf,(const char*)pThreadManager->GetParam());

         while(true)

         {

                   if (pThreadManager->IsClose())

                            break;

                   printf("%s:%d\n",buf,loop++);

         }

         return 0;

}

其中GetParam()得到傳入參數,IsClose()會在調用End()時被通知,就可以安全退出。

 

下面分別是不使用鎖的兩個順序混亂輸出,和使用鎖後順序正常輸出。

 

下面提供JCThreadManager和測試源碼:

GitHub: https://github.com/ljc2266/JCThreadManager.git

CSDN:https://download.csdn.net/download/u011736517/12191005

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章