none
想問一個thread之間的synchronization的問題 RRS feed

  • 問題

  • 我有幾條thread都會read and write同一個file
    例如多條thread都會存取d:\project\a.txt這個txt檔
    請問怎樣做synchronization?
    還有queue也可以做synchronization的嗎?
    因為我也是很多條thread共用一條queue
    謝謝
    2008年4月25日 下午 01:22

解答

所有回覆

  • HI,

     

    您可以使用ReaderWriterLock類別, 請參考:

     

    http://msdn2.microsoft.com/zh-tw/library/9209893x(VS.80).aspx

     

    tihs

    2008年4月26日 上午 08:27
  • Imports System
    Imports System.Threading
    Imports Microsoft.VisualBasic

    Public Class Test


      Private Shared rwl As New ReaderWriterLock()
    Private Shared resource As Integer = 0
    Shared Sub ReadFromResource(timeOut As Integer)
    Try
    rwl.AcquireReaderLock(timeOut)
    Try

    Display("reads resource value " & resource)
    Interlocked.Increment(reads)
    Finally

    rwl.ReleaseReaderLock()
    End Try
    Catch ex As ApplicationException

    Interlocked.Increment(readerTimeouts)
    End Try
    End Sub
    請問可以解釋一下這幾句嗎
    有點看不懂 謝謝
    那一句是lock的?
    因為我找不到設定ReaderLock的目標那句
    rwl.AcquireReaderLock(timeOut) 的用途是??
    他會return甚麼???
    還有
    readerTimeouts
    Interlocked
     reads
    我看不到有dim耶
    這樣也行可以的嗎???
    2008年4月26日 下午 01:12
  •  pastic 寫信:
    我有幾條thread都會read and write同一個file
    例如多條thread都會存取d:\project\a.txt這個txt檔
    請問怎樣做synchronization?
    還有queue也可以做synchronization的嗎?
    因為我也是很多條thread共用一條queue
    謝謝

     

    你要的東西在作業系統的書上都有。

    Process Synchronization 的技術,也可以用在 Thread 中。

    .NET Framework 有 Mutex 和 Semaphore 的技術可用來處理這種事。

    2008年4月26日 下午 02:43
    版主
  • 恩~~
    我正在找.net的Synchronization的語法
    Mutex和
    Semaphore

    謝謝你
    我研究一下
    p.s. 看來要裝一下offline版的msdn了,不然每次都要上網找粉麻煩..不過...容量有點太大了...
    2008年4月26日 下午 03:26
  • tihs兄所介紹的是專業級手法
    若你的應用 不是很在乎效率 只要求邏輯正確
    可以考慮如下之簡單寫法 (見範例)
    要注意的是 所有執行緒對此檔案之讀寫動作 都一定要透過這兩個函式(具SyncLock)
    如此即可在多執行緒下安全工作

    Public Module LogReadWriter
        Public LogPath$ = "c:\xx.Log"
        Private LogSyncObj As New Object

        Public Function WriteLog(ByVal Log$) As String '傳回錯誤訊息
            Try
                SyncLock LogSyncObj
                    Using sw As New IO.StreamWriter(LogPath$)
                        sw.WriteLine(Log$)
                    End Using
                End SyncLock
            Catch ex As Exception
                Return ex.Message
            End Try
            Return ""
        End Function

        Public Function ReadLog(ByRef Log$()) As String '傳回錯誤訊息
            Try
                SyncLock LogSyncObj
                    Using sr As New IO.StreamReader(LogPath$)
                        Dim Logs$ = sr.ReadToEnd
                        Log = Logs.Split(CChar(vbCrLf))
                    End Using
                End SyncLock
            Catch ex As Exception
                Return ex.Message
            End Try
            Return ""
        End Function
    End Module

    2008年4月27日 上午 06:28
  • HI,

     

    rwl.AcquireReaderLock(timeOut)是在做讀取者鎖定, rwl.ReleaseReaderLock()用途在解除讀取者鎖定, 在Reader與Writer的場合適合用ReaderWriterLock類別執行鎖定

    Interlocked類別主要用來遞增, 遞減, 交換變數內容時要做成不可分割的單元

    tihs

    2008年4月27日 上午 08:45
  • 謝謝各位
    我再研究一下
    2008年4月29日 上午 02:57