2014-02-18 82 views
0

我想出了這個被要求用C++編寫代碼的問題。所以,我需要使用C++同步原語。多線程調用相同的函數

問:創建一個接受整數作爲參數並在控制檯上打印的方法(例如foo)。此方法由多個線程訪問。如果兩個或多個線程使用相同的值調用該方法,則只有一個線程應該允許打印其他線程應該等待的值。如果值不同,則所有線程都應允許打印該值。

我的建議是使用全局哈希表讓我們說,unordered_map(我,信號量)地圖。所以,當foo(i)被調用時,foo會檢查散列表。如果我不在散列表中,我們添加map [i] = semaphore(0)。當我打印時,調用map [i] .release()以允許輸入的其他等待線程繼續它們的打印操作。另一方面,如果我已經在哈希中,這意味着具有相同輸入的其他線程正在運行,所以它應該通過map [i] .aquire()等待。

希望你能幫我找到一個更好的解決方案或這個建議的更正版本。

+1

您的解決方案有什麼問題? – nosid

+0

@nosid我相信使用全局散列表不是一個強大的方法,所以應該有更好的解決方案。 – Nazgol

+0

控制檯輸出是否已經同步?如果沒有,你也必須處理。回到原來的問題,該方法只需要跟蹤最近的值輸出,其他線程不會等待(除非訪問/更新最近值輸出時的互斥體或信號量),它們的如果與最後一個值輸出相匹配,輸出請求將被忽略。 – rcgldr

回答

0

示例使用Windows函數和靜態全局互斥鎖。

static HANDLE hMutex; // initialized elsewhere 
// ... 

void DisplayInt(int value) 
{ 
    WaitForSingleObject(hMutex); 
    // ... check value and display message 
    ReleaseMutex(hMutex); 
} 
+0

更復雜的選項是創建另一個線程,顯示通過某種形式的線程間消息傳遞給它的值。再次避免顯示與前一次顯示值相同的值。 – rcgldr