这是模式互斥安全的,因为我觉得它是什么?如果是这样,你怎么称呼它?

lock (_lock) {
    if (_flag) return;
    else _flag = true;
}
try {
    //critical code...
}
finally {
    _flag = false;
}

我想确保临界区,但没有其他线程堆放等待获取锁。很显然,我要确保设置了标志无处。有没有更好的办法?

有帮助吗?

解决方案

没有,是不是安全的。如果你想确保无阻塞相互排斥的,您可以使用Monitor.TryEnter:

if (Monitor.TryEnter(lockObj, 0)) {
    // got the lock !
    try {
        // code
    }
    finally { // release the lock
        Monitor.Exit(lockObj);
    }
}

其他提示

你有没有看着 Monitor.TryEnter

您互斥图案的正确性依赖于分配_flag =假是原子的。试想一下,如果转让可能被另一个线程中断会发生什么。如果分配的中间结果可能被测试被解释为假,一个指派可导致几个线程进入临界区。

互斥图案的正确性也取决于不存在在编译器的优化,其可以重新排列语句的排序。想象一下,一个“聪明”的编译器将移动分配的_flag =假的了,因为_flag不就是介于两者之间的代码(以及它们之间不抛出异常的代码)简称。然后,编译器可以优化的部分在锁定部读

if(_flag) return;

这是为什么格局可能会失败这两个例子都具有高度的投机,我认为你是在假设它的工作原理是安全的。然而,在工作所需的其他选项的存在,你就要去使用(见其他职位)更好。如果有其他的开发商在相同的代码,他们不需要考虑的模式是否有效。

那不是一个简单的lock(Object)声明工作?幕后,它创建一个Monitor块内的try... finally和临界区。

private static readonly Object lockMe = new Object();
lock(lockMe)
{
    // critical code
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top