線程同步的問題

問題場景:

在實現一個簡單的線程池的過程中,

每一個線程都可以訪問一個ThreadPool的對象,在每一個線程中都嘗試不斷的調用GetJob(){...}

在調試的過程中發現,雖然給GetJob中的關鍵部位加了線程同步的代碼,可是被同步的部位中,仍然產生了重複獲取任務的現象!

最後在嘗試鎖定問題的過程中發現,所有演示EnterCriticalSection(); 的代碼中需要同步的關鍵數據都需要是靜態的!

這時才提醒我,原來在每一個線程中,都拷貝了一份jobList,雖然在同步的部位jobList.pop_front(); 之後,容器中的對象應該減少,但是隻是改變了當前線程中的jobList,所以當切換到另外一個線程中的時候,jobList中的對象數量還是原來的數量!!!

 

疑惑:

即使在代碼中,我們只產生了一個ThreadPool對象,然後通過指針將這個對象傳給線程回調函數的時候,這個對象是唯一的。但是

但是通過調用ThreadPool中GetJob(){} 來對ThreadPool對象中的變量進行改變的時候,都會造成很多份不同的數據的同時存在!!!

 

在使用多線程進行同步的時候,需要確保所有的線程所同步的變量是static的或者全局唯一的!

 

理解如果有誤,敬請指教!

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