簡體   English   中英

帶鎖的C#多線程

[英]C# Multithreading with Lock

我是C#的初學者。 我正在看一下多線程的樣本。

我已經設置了一個多線程調用方法DoTransactions() ,它反過來會生成一個隨機數作為amount ,並調用方法Withdraw()來按amount扣除salary

1)我不明白為什么作者選擇鎖定對象thisLock而不是鎖定工資? 我看到其他一些人也通過聲明一個對象並鎖定它來鎖定線程。

2)有時我無法調試其他線程運行時調用的方法。 (按F10 / F11)。 (例如方法Withdraw() )。 有什么理由嗎?

Department dep = new Department(1000); 
Thread t = new Thread(new ThreadStart(dep.DoTransactions));   //set up 1000 threads.

class Department
    {
        private Object thisLock = new Object();
        int salary = 10000;

        int Withdraw(int amount)
        {
            lock (thisLock)
            {
                if (salary >= amount)
                {
                    salary = salary - amount;
                    return amount;
                }
            }
        }
  1. 您只能鎖定類(引用類型),而Salary是一個值為類型的int。

MSDN:

lock語句的表達式必須表示reference-type的值。 對於lock語句的表達式,沒有執行隱式裝箱轉換(第6.1.5節),因此表達式的編譯時錯誤表示值類型的值。

http://msdn.microsoft.com/en-us/library/aa664735(v=vs.71).aspx

  1. 你是什​​么意思你無法調試? 調試器可能會在線程之間跳轉。

使用鎖定,以便任何時候只有1個線程可以訪問該位代碼。 要啟用線程之間的同步,它們必須輪流鎖定一個通常可供所有線程使用的對象。

你在lock語句中放入的內容(如lock (thisLock)不是被鎖定的數據 如果你想一想就不會出現這種情況:如果你想修改兩個變量,你會把哪一個放在lock (答案:沒有答案。不可能。)。

相反,您訪問一個對象,該對象在訪問受鎖定邏輯保護的數據時將按照慣例始終鎖定。

調試多線程應用程序時,使用斷點強制查看特定的代碼行。 你不能依靠你踩到並踩到順序工作。

回答你的第二個問題:

可能需要首先選擇“全部中斷”(單擊“全部中斷”按鈕)以停止運行所有線程,然后轉到“調試| Windows |線程”以查看可以調試的所有線程的列表。 (當然,每個人都有一個單獨的堆棧框架。)

從那里你可以雙擊一個線程,看看是否有任何源代碼。 (有些將是你沒有啟動的“內部”線程,並且這些線程沒有你能看到的源代碼。只需繼續點擊線程,直到找到一個有趣的線程。;)

除此之外,在您感興趣的線程將執行的代碼中設置斷點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM