c# - SpinLock.Enter 获取锁失败怎么办?

标签 c# .net multithreading

SpinLock .Net 中的结构可用于管理多个线程对资源的访问。与普通锁不同,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。

其他线程原语(例如 Monitorlock(...){})始终获取锁(或永远等待获取锁)。但是 SpinLock.Enter 方法使用 ref bool 参数来指示获取锁是否失败。

需要什么 ref bool lockTaken 以及在什么情况下 Monitor.Enter 会失败(从而将 lockTaken 设置为 false ?)

最佳答案

使用此“lockTaken”模式是为了确保线程同步构造确实获取了锁。事情是 - Monitor 和 SpinLock 在 finally block 中内部退出,并在 try block 中获取锁。

现在,如果线程已进入 try block 并在获得锁定之前中止,则不应在 finally block 中释放它。这个问题是通过 ref bool 变量解决的。

Boolean taken = false;
try {
    // An exception (such as ThreadAbortException) could occur here...
    Monitor.Enter(this, ref taken);
}
finally {
    if (taken) Monitor.Exit(this);
}

关于c# - SpinLock.Enter 获取锁失败怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165323/

相关文章:

android - "new Thread"没有启动新线程?

带有 WebRequest 的 C# 多线程程序

c# - 在 C# 中使用列表输出类的详细信息

c# - 为什么 C# 结构是不可变的?

c# - 如何将 XML 数据加载到数据结构中?

c# - 由于字符串是不可变的,具有相同字符串值的变量是否指向同一个字符串对象?

c# - WebSphere MQ .NET API

java - 无法在 Runnable 中实现 run()

c# - 调用 EndReceive 时抛出 ObjectDisposeException(异步客户端套接字)

c# - 在哪里放置实现相同接口(interface)的多个类所需的通用逻辑?