如何在锁定语句中实现互斥,但如果锁定,则会跳过该块?

Lou*_*hys 3 .net c# concurrency thread-safety mutual-exclusion

使用lock语句,可以"确保一个线程不进入代码的关键部分而另一个线程在关键部分.如果另一个线程试图输入锁定的代码,它将等待,阻塞,直到该对象被释放".

如果我想要的行为是,如果另一个线程试图输入锁定的代码,它将跳过整个代码(而不是等待锁被释放)怎么办?我想到的一个想法就是使用旗帜,比如说

if(flag) return;
flag = true;
//do stuff here
flag =false;
Run Code Online (Sandbox Code Playgroud)

但我知道这不安全,因为两个线程可以在任何人设置为true之前传递第一行,或者如果异常情况下该标志永远不会设置为false.你能提出改进或替代吗?

Ani*_*Ani 5

使用这种超负荷Monitor.TryEnter,它可以让你指定超时.

尝试在指定的时间内获取指定对象的独占锁.

返回值类型:System.Boolean如果当前线程没有阻塞地获取锁,则返回true;否则返回false.否则,错误.

在您的情况下,您可能希望使用接近 的超时TimeSpan.Zero.

如果你不希望线程尝试把锁等待任何时间的长短,你可以这样超负荷Monitor.TryEnter,不接受TimeSpan的说法.此方法将立即返回而无需等待 - 非常接近您尝试使用的标志技术的情绪.