2011-09-08 73 views
0

我已經寫了一個DLL來存儲memroy中的一些信息,有很多線程想要 同時訪問數據,所以我使用讀/寫鎖來同步。並且我將 的某些功能導出給用戶,在函數中,我需要鎖,然後獲取數據,然後退出 並釋放鎖。例如,像這個功能。實現兩級鎖

void GetData(data) 
{ 
    //require lock 

    //get data 

    //release lock 
} 

我的用戶可以調用的GetData多次在那裏的功能,例如,

void ProcessData() 
{ 
    // do something 1 

    GetData(data1); 

    // do something 2 

    GetData(data2); 

    ... 
} 

在同一時間,其他線程可以通過我的DLL的調用其他導出功能改變我的DLL數據,所以數據可能會在GetData(data)之間變化;和GetData(data2);但是我的用戶希望我的數據在ProcessData中永遠不會改變,因爲在這種情況下data1可能會與data2相關聯。 我不想在我的dll中暴露我的鎖。 有沒有辦法實現這樣的事情,Thx!

+1

請用適合的語言爲您的問題添加標籤...... –

+0

您似乎已經想出了您需要做的事情,您只需要熟悉正確的庫接口即可。最好的答案可能取決於你的平臺。作爲一些可能的示例,搜索「pthread_rwlock_init」或「InitializeSRWLock」。 Boost或C++ 11可能也有幫助;不知道他們提供了什麼...此外,根據您的需要,您可能需要考慮簡單的互斥鎖而不是rwlock。 – asveikau

+0

您發現唯一可靠鎖定的是* client *代碼。通常最不可能的是正確的,這就是線程的難點。 –

回答

0

您是否希望人們能夠在ProcessData運行時寫入數據?或者應該寫入的人在ProcessData完成之前被阻止?

如果是,那麼您可以導出2個函數,它們將使ProcessData鎖定任何編寫器。

LockOutWriters() { // lock } 
WriteData() { // blocks if above is locked } 
UnLockWriters() { // unlock } 

如果沒有,那麼你就需要採取的數據快照當時的GetData()被調用,並確保無論何時調用過程數據的GetData,它從快照中提取數據。