我试图让我的多线程理解锁定。我尽我所能教导自己,但其中一些问题需要澄清。另一个锁定问题
我已经通过一段代码尝试了三次迭代。
在这段代码,需要锁定的唯一事情是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