c# - 如何实现像 lock 语句中的互斥,但如果它被锁定,该 block 将被跳过?

标签 c# .net concurrency thread-safety mutual-exclusion

使用 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 overloadMonitor.TryEnter,它不接受 TimeSpan 参数。此方法将立即返回而无需等待 - 非常接近您尝试使用的标记技术的情绪。

关于c# - 如何实现像 lock 语句中的互斥,但如果它被锁定,该 block 将被跳过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652189/

相关文章:

c# - 如何调用 Delegate.Target 的 .Invoke 方法?

c# - 如何告诉 GridView 在 CellClick 上打开超链接?

c# - 主窗体上的状态消息

concurrency - 为什么我的并发函数在 Go 中过早退出?

java - tomcat/servlet 中的并发

c++ - Visual C++ 2010 中的 STL 映射实现和线程安全

c# - SEO:自定义站点地图提供程序与静态 web.sitemap 文件

c# - 将字符串写入文本文件并确保它始终覆盖现有内容。

c# - 为什么 C# 允许将匿名对象分配给属于类类型的类字段?

c# - WPF UIElement 刷新错误?