2017-10-13 61 views
1

如何允許在不鎖定的情況下從多個線程同時調用某個方法,但是在調用其他方法時它會鎖定在哪裏?.Net Synclock只讀更新時的方法

例子:

Private DataLock As New Object() 

Private Function GetInfo() As String 
    SyncLock DataLock 
     'Read existing data and return a String 
    End SyncLock 
End Function 

Private Sub UpdateData() 
    SyncLock DataLock 
     'Update/Change existing Data 
    End SyncLock 
End Sub 

如何修改上面的代碼,以便:

  • UpdateData()調用時始終觸發鎖,鎖本身和GetInfo
  • GetInfo()不鎖本身(所以它可以在多個線程上同時運行),但它會鎖定UpdateData,直到完成
+0

對於這樣的事情,你可以使用信號量。我不太瞭解他們如何告訴你,但它給了你一些谷歌。 – dwilliss

+0

您可能會看看'ReaderWriterLockSlim'類。它專門用於允許多個讀者或一個作者。 – jmcilhinney

+0

@jmcilhinney謝謝,我相信'ReaderWriterLockSlim'是一個很好的解決方案 –

回答

3

這是直接模擬到您發佈使用ReaderWriterLockSlim類的代碼:

Private dataLock As New ReaderWriterLockSlim() 

Private Function GetInfo() As String 
    dataLock.EnterReadLock() 

    Try 
     'Read existing data and return a String 
    Finally 
     dataLock.ExitReadLock() 
    End Try 
End Function 

Private Sub UpdateData() 
    dataLock.EnterWriteLock() 

    Try 
     'Update/Change existing Data 
    Finally 
     dataLock.ExitWriteLock() 
    End Try 
End Sub 

你可能想,雖然考慮Try方法,它允許你指定的最大時間來等待鎖。

+0

'Try ... Finally'似乎是必須的,因爲'dataLock.ExitReadLock'否則不會發生,如果它在返回語句後出現 –

+0

我是不確定您的評論是否參考了我回答中的最後一個陳述,但是當我提到'Try'方法時,我並不是指'Try ... Finally'語句,而是使用'TryEnterReadLock'和'TryEnterWriteLock' 。 – jmcilhinney