2013-07-21 183 views
2

我想實現一個函數,我創建5對線程(一對意味着一個線程寫入,另一個讀取,並且兩個線程共享一個列表(5個列表)這種情況下)。 我需要創建五個互斥鎖?如何申報呢?在全球範圍?多線程互斥鎖可以使用多個互斥鎖

回答

1

我需要創建五個互斥鎖?

取決於你的數據結構。如果您有五個不同的數據對象可以安全地從五個關聯的線程對中訪問,那麼如果所有線程都訪問,則需要五個數據對象只有一個數據對象,你只需要一個。

如何聲明它們?在全球範圍內?

將您的數據對象,互斥鎖和(寫入)線程函數封裝在類中。我會說你不需要另一個閱讀線程,那是通常運行的那個線程,或者其他任何可以訪問這個類的實例的線程。

class MyAsynchDataProvider 
{ 
public: 

    void run() 
    { 
     writeThread = std::thread(writeDataFunc,this); 
    } 

    MyDataStruct getSafeDataCopy() 
    { 
     std::lock_guard lock(dataGuard); 
     return data; 
    } 

private: 
    std::mutex dataGuard; 
    MyDataStruct data; 

    std::thread writeThread; 

    static void writeThreadFunc(MyDataWorker* thisPtr) 
    { 
     // ... 
     std::lock_guard lock(thisPtr->dataGuard); 
     // Write to thisPtr->data member 
    } 
}; 
+0

你可以給我一個封裝在類中的互斥鎖的例子。 – Ericzhang88120

+0

@ Ericzhang88120夠好嗎? –

+0

還有一點,我的兩個線程不在同一個班級。因此,他們可能需要共享相同的鎖 – Ericzhang88120