2个线程同时进入一个锁定的代码块
2 threads entering a locked block of code at the same time
我试图一次只允许 1 个线程这样输入某个代码块:
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 调试器中确认了这一点。有时只有 1 个线程进入,这很好,但至少有一半的时间,2 个线程进入——看起来永远不会超过 2 个。
在那个 if 块中,我正在这样做:
id.ScanCode = string.Empty;
return;
对我来说,这似乎应该阻止第二个线程进入,如果它确实被阻止的话。但也许我做错了。防止第二个线程进入那里的最简单方法是什么?他们会同时进入吗?
Lock 不会阻止任何数量的线程进入该块。它只是延迟他们直到它被释放。它只会向您保证一次只有一个线程会进入该代码块。一旦第一个线程存在,第二个线程将锁定代码并 运行 它。等等...
如果您只需要第一个线程来执行该代码块,只需在它第一次获得时设置一个标志 运行,对于连续的线程,只需先检查该标志。
我试图一次只允许 1 个线程这样输入某个代码块:
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 调试器中确认了这一点。有时只有 1 个线程进入,这很好,但至少有一半的时间,2 个线程进入——看起来永远不会超过 2 个。
在那个 if 块中,我正在这样做:
id.ScanCode = string.Empty;
return;
对我来说,这似乎应该阻止第二个线程进入,如果它确实被阻止的话。但也许我做错了。防止第二个线程进入那里的最简单方法是什么?他们会同时进入吗?
Lock 不会阻止任何数量的线程进入该块。它只是延迟他们直到它被释放。它只会向您保证一次只有一个线程会进入该代码块。一旦第一个线程存在,第二个线程将锁定代码并 运行 它。等等...
如果您只需要第一个线程来执行该代码块,只需在它第一次获得时设置一个标志 运行,对于连续的线程,只需先检查该标志。