Я пытаюсь заблокировать понимание многопоточности. Я делаю все возможное, чтобы учить себя, но некоторые из этих вопросов нуждаются в разъяснении.
Я прошел три итерации с куском кода и экспериментировал с блокировкой.
В этом коде единственное, что требует блокировки, это 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) ...
}