互斥:是这样安全吗?
-
23-08-2019 - |
题
这是模式互斥安全的,因为我觉得它是什么?如果是这样,你怎么称呼它?
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
}
不隶属于 StackOverflow