使用 the lock statement ,可以“确保一个线程不会进入代码的临界区,而另一个线程处于临界区。如果另一个线程试图进入锁定的代码,它将等待、阻塞,直到对象被释放。”
如果我想要的行为是如果另一个线程试图进入锁定的代码,它将跳过整个代码(而不是等待锁被释放)怎么办?我想到的一个想法是使用一个标志,比如
if(flag) return;
flag = true;
//do stuff here
flag =false;
但我知道这不安全,因为两个线程可以在任何人设置为 true 之前通过第一行,或者在出现异常的情况下永远不会将标志设置为 false。你能建议改进或替代方案吗?
最佳答案
使用this overload Monitor.TryEnter
,它允许您指定超时。
Attempts, for the specified amount of time, to acquire an exclusive lock on the specified object.
Return Value Type: System.Boolean true if the current thread acquires the lock without blocking; otherwise, false.
在您的情况下,您可能希望使用接近 TimeSpan.Zero
的超时。
如果您不希望尝试获取锁的线程等待任何 时间长度,您可以只使用this overload。 Monitor.TryEnter
,它不接受 TimeSpan
参数。此方法将立即返回而无需等待 - 非常接近您尝试使用的标记技术的情绪。
关于c# - 如何实现像 lock 语句中的互斥,但如果它被锁定,该 block 将被跳过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652189/