[英]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;
}
}
}
MSDN:
lock語句的表達式必須表示reference-type的值。 對於lock語句的表達式,沒有執行隱式裝箱轉換(第6.1.5節),因此表達式的編譯時錯誤表示值類型的值。
http://msdn.microsoft.com/en-us/library/aa664735(v=vs.71).aspx
使用鎖定,以便任何時候只有1個線程可以訪問該位代碼。 要啟用線程之間的同步,它們必須輪流鎖定一個通常可供所有線程使用的對象。
你在lock
語句中放入的內容(如lock (thisLock)
) 不是被鎖定的數據 。 如果你想一想就不會出現這種情況:如果你想修改兩個變量,你會把哪一個放在lock
? (答案:沒有答案。不可能。)。
相反,您訪問一個對象,該對象在訪問受鎖定邏輯保護的數據時將按照慣例始終鎖定。
調試多線程應用程序時,使用斷點強制查看特定的代碼行。 你不能依靠你踩到並踩到順序工作。
回答你的第二個問題:
可能需要首先選擇“全部中斷”(單擊“全部中斷”按鈕)以停止運行所有線程,然后轉到“調試| Windows |線程”以查看可以調試的所有線程的列表。 (當然,每個人都有一個單獨的堆棧框架。)
從那里你可以雙擊一個線程,看看是否有任何源代碼。 (有些將是你沒有啟動的“內部”線程,並且這些線程沒有你能看到的源代碼。只需繼續點擊線程,直到找到一個有趣的線程。;)
除此之外,在您感興趣的線程將執行的代碼中設置斷點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.