Да, так работает замок.
Ключевое слово lock помечает блок операторов как критический раздел, получая взаимное исключение блокировку для данного объекта, выполняя оператор и затем снимая блокировку.
Взаимное исключение означает, что в любой момент может быть не более одного потока, который удерживает блокировку.
Заниматься этим - плохая идея и не рекомендуется. Вы должны создать приватный объект и заблокировать его. Чтобы решить вашу проблему, вы можете заблокировать два разных объекта.
private object lockObject1 = new object();
private object lockObject2 = new object();
public void foo()
{
lock (lockObject1)
{
// ...
}
}
public void bar()
{
lock (lockObject2)
{
// ...
}
}
В качестве альтернативы вы можете повторно использовать тот же замок, но переместить его в цикл так, чтобы у каждого цикла был шанс продолжить:
while (stopThreads == false)
{
foreach (var acc in myList)
{
lock (lockObject)
{
// process some stuff
}
}
}
Однако я бы посоветовал вам потратить некоторое время, чтобы понять, что происходит, вместо того, чтобы переупорядочивать строки кода, пока он не будет работать на вашем компьютере. Написание правильного многопоточного кода затруднено.
Для остановки потока я бы порекомендовал эту статью: