2个线程同时进入锁定的代码块

时间:2015-02-06 18:28:41

标签: c# multithreading c#-4.0

我试图一次只允许一个线程输入一段代码:

private static object lockObject = new object();

protected override void WndProc(ref Message message) {
    if (id != null) {
        id.ProcessMessage(message);

        lock(lockObject) {
            if (id.ScanCode.Length > 4) {
                ...
            }
        }
    }

    base.WndProc(ref message);
}

有时2个线程进入并执行代码。我在VS调试器中确认了这一点。有时只有一个线程进入,这很好,但至少有一半的时间,2个线程进入 - 看起来从不超过2个。

在if-block里面,我正在这样做:

id.ScanCode = string.Empty;
return;

对我来说,这似乎应该阻止第二个线程进入,如果它被阻止了。但也许我做错了。防止第二个线程进入那里最简单的方法是什么?他们可以同时进入吗?

1 个答案:

答案 0 :(得分:5)

Lock不会阻止任何数量的线程进入该块。它只会延迟它们直到它被释放。它只会向您保证,AT A TIME中只有一个线程将进入该代码块。第一个线程存在后,第二个线程将锁定代码并运行它。等等...

如果只需要FIRST线程来执行该代码块,只需在第一次运行时设置一个标志,对于连续的线程,只需先检查该标志。