我試圖讓我的多線程理解鎖定。我盡我所能教導自己,但其中一些問題需要澄清。另一個鎖定問題
我已經通過一段代碼嘗試了三次迭代。
在這段代碼,需要鎖定的唯一事情是this.managerThreadPriority。
首先,簡單的程序方法,用簡約鎖定。
var managerThread = new Thread
(
new ThreadStart(this.ManagerThreadEntryPoint)
);
lock (this.locker)
{
managerThread.Priority = this.managerThreadPriority;
}
managerThread.Name = string.Format("Manager Thread ({0})", managerThread.GetHashCode());
managerThread.Start();
下,一個單獨的語句來創建和啓動一個新的線程,但似乎鎖被作用域太大,包括線程的創建和啓動。編譯器不會奇蹟般地知道在使用this.managerThreadPriority之後鎖可以被釋放。
這種天真的鎖定應該避免,我會假設。
lock (this.locker)
{
new Thread
(
new ThreadStart(this.ManagerThreadEntryPoint)
)
{
Priority = this.managerThreadPriority,
Name = string.Format("Manager Thread ({0})", GetHashCode())
}
.Start();
}
最後,創建和啓動一個新線程的單個語句,只在共享字段周圍「嵌入」鎖。
new Thread
(
new ThreadStart(this.ManagerThreadEntryPoint)
)
{
Priority = new Func<ThreadPriorty>(() =>
{
lock (this.locker)
{
return this.managerThreadPriority;
}
})(),
Name = string.Format("Manager Thread ({0})", GetHashCode())
}
.Start();
注意關於鎖定語句範圍的評論?例如,如果我需要使用if
語句中的字段並且該字段需要被鎖定,我是否應該避免鎖定整個if
語句?例如。
bool isDumb;
lock (this.locker) isDumb = this.FieldAccessibleByMultipleThreads;
if (isDumb) ...
VS.
lock (this.locker)
{
if (this.FieldAccessibleByMultipleThreads) ...
}
即使您只在一個線程中讀取並在另一個線程中寫入,仍然需要鎖定讀取線程 - 否則不能保證您將看到來自其他線程的新寫入的數據。 – 2008-09-30 22:00:56