主要有兩種方式。一種可能是最簡單的方法就是簡單地將每個線程發送給自己的數據結構副本。這樣你就不必使用同步來保護數據,因爲沒有線程共享另一個線程的數據。
但是這在很多情況下都不起作用。有時你確實需要共享一個共同的數據結構。在這種情況下,您需要使用某種形式的同步對象來保護數據結構。 Boost.Threads提供了一些跨平臺的,我相信有人會告訴你如何使用它們。既然你問了關於Windows的具體問題,我會告訴你一個Windows方法。可以使用CRITICAL_SECTION。首先,您需要初始化的關鍵部分在你的主線程,你脫掉你的工作線程之前:
int main()
{
// ...
CRITICAL_SECTION cs;
InitializeCriticalSection(&cs);
// ...
}
然後將指針傳遞給CS到每個工作線程。 (這留作鍛鍊。)在每個工作線程中,在處理數據之前輸入cs,並在完成時將其保留。
CRITICAL_SECTION* pcs = ...; // passed in from main thread
EnterCriticalSection(pcs); // this will block until the cs is "available"
list->next = ...
LeaveCriticalSection(pcs); // makes the cs available to other threads
以上是psudocode,有很大的改進空間。例如,關鍵部分應該包裝在RAII對象中,以便在完成後自動銷燬。同樣,鎖定和解鎖也應該在RAII對象中完成,無論您如何退出線程函數,即使面臨異常,也始終解鎖鎖定和解鎖。
您應該注意,CRITICAL_SECTION只能由單個進程使用。如果您需要跨多個進程使用互斥對象類型的對象(而不是您在此需要的),那麼您需要使用named mutex。
要做的第一件事是封裝整個列表以及所有直接在類中訪問它的列表,並強制任何想訪問它的類來使用該類。這將防止重複代碼,確保使用列表的任何內容都遵守您提出的任何同步方法。 – Blrfl 2010-12-14 18:14:06