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



我试图一次只允许一个线程这样输入某个代码块:

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);
}

有时有两个线程进入其中并同时执行代码。我已经在VS调试器中确认了这一点。有时只有1个线程进入,这很好,但至少有一半的时间,有2个线程进入——看起来永远不会超过2个。

在那里面,如果我在做这个:

id.ScanCode = string.Empty;
return;

在我看来,如果第二个线程确实被阻塞了,这应该会阻止它进入。但也许我做错了。防止第二个线程进入的最简单方法是什么?他们会同时进入吗?

锁定不会阻止任何数量的线程进入该块。它只是拖延他们,直到它被释放。它只能保证一次只有一个线程会进入该代码块。一旦第一个线程存在,第二个线程就会锁定代码并运行它

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

最新更新