none
多執行存取同一Dictionary或list的問題 RRS feed

  • 問題

  • 大家好:

         我有一個專案 , 希望使用多執行緒建立一個dictionary及list(of T),但在新增一筆資料時,會發生錯誤 , 目前推測是多執行緒同時寫入所造成的問題 , 不曉得像這樣的case ,程式如何避免同時寫入或讀取list中的同一筆資料.先感謝所有回覆者

        Dim Query_fp As List(Of Queryfp) = New List(Of Queryfp)
        Dim path_index As Dictionary(Of String, Queryfp) = New Dictionary(Of String, Queryfp)
     

    --------------------------------

                    Dim fp1 As New Query(n, k.item, 1, 1)

                    Query_fp.Add(fp1)

                    path_index.Add(fp1.kk, fp1)
     

     

    2011年9月20日 下午 01:49

解答

  • [執行緒同步處理 (C# 和 Visual Basic)]

    [SyncLock 陳述式]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 jeff-huangch 2011年9月24日 上午 02:09
    2011年9月20日 下午 02:13
  • The specified CGI application encountered an error and the server terminated the process.

    會出現以上的錯誤 , 清除cookies也一樣 , 請問IE如何處理?

     

    你有將偏好模式選『傳統』了嗎?

    IE是IE幾呢?如果是IE8以上,可以進入開發者工具裡面清除cookie。

    補上清除cookie的正確步驟:按F12進入開發者工具=>快取=>清除網域的cookie,按確定。

    接著重新整理應該就正常了,接著記得去改『偏好設定』,改成傳統模式。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki

    • 已編輯 91MVP 2011年9月21日 下午 03:56
    • 已標示為解答 jeff-huangch 2011年9月24日 上午 02:11
    2011年9月21日 下午 03:48

所有回覆

  • [執行緒同步處理 (C# 和 Visual Basic)]

    [SyncLock 陳述式]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 jeff-huangch 2011年9月24日 上午 02:09
    2011年9月20日 下午 02:13
  • 謝謝,但連結無法用.

    2011年9月20日 下午 10:30
  • 連結是可以連的哦! 不知您說無法用是說連過去會錯嗎([MSDN文件庫]The specified CGI application encountered an error and the server terminated the process)?

    還是說那個方式一樣會錯誤呢?

    不妨把您的完整的Code貼出來,大家可以一起幫忙哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年9月21日 上午 01:03
  • 關於MSDN文件庫無法連結的問題也可以參考這一篇去修正

    [關於最近MSDN文件庫常常出現問題]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年9月21日 上午 02:15
  • 您可以使用ConcurrentDictionary類別代替, 可以不要加入任何控制的語法
    2011年9月21日 下午 01:15
  • The specified CGI application encountered an error and the server terminated the process.

    會出現以上的錯誤 , 清除cookies也一樣 , 請問IE如何處理?

     

    2011年9月21日 下午 01:42
  • The specified CGI application encountered an error and the server terminated the process.

    會出現以上的錯誤 , 清除cookies也一樣 , 請問IE如何處理?

     

    你有將偏好模式選『傳統』了嗎?

    IE是IE幾呢?如果是IE8以上,可以進入開發者工具裡面清除cookie。

    補上清除cookie的正確步驟:按F12進入開發者工具=>快取=>清除網域的cookie,按確定。

    接著重新整理應該就正常了,接著記得去改『偏好設定』,改成傳統模式。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki

    • 已編輯 91MVP 2011年9月21日 下午 03:56
    • 已標示為解答 jeff-huangch 2011年9月24日 上午 02:11
    2011年9月21日 下午 03:48
  • 謝謝Bill Chung的解答及大家的幫忙 ,以下是我以MSDN範例改的程式 , 我希望ba這個整數變數可以在多執行緒中被依次加1 , 而不會因多執行緒的環境而使ba變數亂跳 , 當未加上syncloc  lockk時確實會使ba變數不規則亂跳(如圖1), 這應該是兩個執行緒同時抓取ba數值所造成.加上synclock  lock之後,即可確保兩執行緒不會同時存取ba (如圖2) , 以上是我的實驗結果 , 也提供大家參考 , 如有遺漏或錯誤 , 請大家不吝指教.

    圖1(非正常要求)

     

    圖2(預期情況)

     

    Imports System.Threading

    Module Module1

        Class Account
            Dim thisLock As New Object
     

           Dim ba As Integer = 0

           Public Sub DoTransactions()
                For i As Integer = 1 To 100
                    SyncLock  thisLock

                        ba += 1
                        Console.WriteLine("Balance before Withdrawal :  " & ba)

                    End SyncLock

                Next
            End Sub

        End Class

        Sub Main()
            Dim threads(10) As Thread
            Dim acc As New Account()

            For i As Integer = 0 To 1
                Dim t As New Thread(New ThreadStart(AddressOf acc.DoTransactions))
                threads(i) = t
            Next

            For i As Integer = 0 To 1
                threads(i).Start()
            Next

            Console.Read()
        End Sub


    End Module

     


    2011年9月24日 上午 02:09