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