2011-03-29 103 views
2

你好,我用C語言構建了一個散列表。我已經對單元進行了測試,足以確信它的工作原理。問題是數據結構將被動態鏈接到我沒有編寫並且可能正在使用線程的代碼。所以我需要對它進行同步,以便理論上可以同時修改/讀取任意數量的線程。研究並行線程互斥API後,我做了以下在C中實現同步數據結構

聲明靜態全局變量:

static pthread_mutex_t lock; 

在HashTable_init(使用哈希表之前,它總是叫)我初始化它:

pthread_mutex_init(&lock,NULL); 

在讀取每個函數/寫,我把一個鎖在啓動結構:

pthread_mutex_lock(&lock); 

並在最後解鎖:

pthread_muter_unlock(&lock); 

這足以使數據結構同步嗎? (因爲目前我的程序掛起)。

謝謝

+0

你的互斥量是遞歸的嗎?也許你有一個死鎖,因爲你試圖鎖定兩次 – 2011-03-29 14:18:34

+0

請確保你在返回錯誤路徑之前解鎖互斥鎖。 – nos 2011-03-29 14:19:30

回答

2

這可能是不夠的。通過鎖定每種方法,確保您的容器內部結構在任何時候都是一致的;但容器的一些用途可能需要更多。

請考慮以下相當簡單的情況:在一個線程中,您通過某個鍵找到一個項目並開始編輯它。當find()完成時,它釋放鎖定,然後返回對項目的引用。與此同時,鎖可以被獲取,另一個線程可能會例如刪除這個項目,意外的是第一個線程。

設計和開發一個好的安全併發容器並不是一件容易的事情。我會建議你,而不是尋找現成的解決方案。

1

看起來不錯,但只要你確保init由第一線程和其他線程開始訪問互斥體之前調用一次。