C++編程中是不是線程越多越好?

多線程編程可以提高程序的併發執行能力,那是不是線程越多越好呢?

大家可以參考下面的代碼做測試:

  1. #define  MAX_WORKTHREAD     5  
  2. map<intint> m_task;//用於統計每個線程做的任務數  
  3. std::deque<int> m_MsgQueue;//處理的消息隊列  
  4.     for (i=0; i<MAX_WORKTHREAD; i++)  
  5.     {  
  6.         int* nTemp = new int;  
  7.         *nTemp = i;  
  8.         hWTHandle[i] = CreateThread(NULL, 0, WorkThread, nTemp, 0, &g_dwWorkThread[i]);   
  9.         WorkThreadCout ++;  
  10.         m_task[i] = 0;  
  11.         Sleep(100);  
  12.     }  
  13.       
  14. DWORD WINAPI WorkThread(LPVOID lpParam)    
  15. {     
  16.     // cout << "No." << g_dwThreadID << " thread is running." << endl;    
  17.     while (TRUE)    
  18.     {    
  19.         int* nRemp = (int*)lpParam;  
  20.   
  21.         int n = -1;  
  22.   
  23.         EnterCriticalSection(&g_cs);  
  24.         //cout << "No " << *nRemp << ", " << g_dwWorkThread[*nRemp] << " thread is running." << endl;  
  25.         LeaveCriticalSection(&g_cs);  
  26.   
  27.         EnterCriticalSection(&g_MsgQueue);  
  28.         if (!m_MsgQueue.empty())  
  29.         {  
  30.             n = m_MsgQueue.front();  
  31.             m_MsgQueue.pop_front();  
  32.           
  33.             m_task[*nRemp]++;  
  34.         }  
  35.         LeaveCriticalSection(&g_MsgQueue);  
  36.   
  37.         EnterCriticalSection(&g_cs);  
  38.         cout << "No:" << *nRemp << ", " << n << endl;  
  39.         LeaveCriticalSection(&g_cs);  
  40.   
  41.         Sleep(2000);//備註1  
  42.   
  43.     }    
  44.   
  45.     cout << "No " << lpParam << " end" << endl;  
  46.   
  47.     return 0;    
  48. }  

當任務執行完了後,可以打印m_task裏的數據:

  1. std::map<intint>::iterator IterCount;  
  2. for(IterCount=m_task.begin(); IterCount!=m_task.end();IterCount++)  
  3. {  
  4.     int nThreadId= (*IterCount).first;  
  5.     int nCount = (*IterCount).second;  
  6.                       
  7.     EnterCriticalSection(&g_cs);  
  8.     cout << "nThreadId:" << nThreadId << ", nCount" << nCount<<endl;  
  9.     LeaveCriticalSection(&g_cs);  
  10.   
  11.     (*IterCount).second = 0;  
  12. }  


可以修改備註1處的Sleep(2000),分別改爲1000,3000,5000,10000等看看結果有什麼區別?這裏的時間其實是模擬執行一個任務所需要的時間,也可以用隨機函數隨機產生。

另外,多線程操作全局變量的時候,一定要用線程同步(如臨界區等)來操作,否則,會有問題。在使用的過程中,一定要注意資源和線程之間的關係,避免死鎖發生。

經過測試,多線程中的線程數是不是越多越好?這個問題的答案應該就有了。






原創鏈接:http://blog.csdn.net/wujunokay/article/details/12307773

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