我试图锁定我的多线程理解。我正在尽我所能自学,但其中一些问题需要澄清。
我用一段代码经历了三次迭代,尝试锁定。
在这段代码中,唯一需要锁定的是 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) ...
比。
lock (this.locker)
{
if (this.FieldAccessibleByMultipleThreads) ...
}