C# 使用联锁交换的状态变量的临界段
我试图使用成员变量(C# 使用联锁交换的状态变量的临界段,c#,locking,critical-section,interlocked,C#,Locking,Critical Section,Interlocked,我试图使用成员变量(int\u state)上的Interlocked.Exchange来保护一个关键部分。代码如下: if (Interlocked.Exchange(ref _state, 1) == 0) { // *** Danger zone *** try { // Do something } finally { _state = 0; } } \u state也在别处读取以确定状态,因此
int\u state
)上的Interlocked.Exchange
来保护一个关键部分。代码如下:
if (Interlocked.Exchange(ref _state, 1) == 0)
{
// *** Danger zone ***
try
{
// Do something
}
finally
{
_state = 0;
}
}
\u state
也在别处读取以确定状态,因此这是必需的
我担心的是,如果“危险区”发生异常,\u state
将永远不会被设置为0,并且将永远无法再次输入关键部分
在仍然能够设置状态变量的情况下,有没有更好的方法来实现这一点?我应该使用双锁模式吗?为什么不将危险区放在try块内?请参阅锁上的文档:@Evk那里没有C代码。我的观点是,编译器放置在那里的中间代码可能会导致异常@AdamBenson当然我知道
lock
,但是考虑到\u state
用于控制对关键部分的访问,并且在其他地方读取,这对我提到的\u state
变量有何帮助?这就是为什么我使用Interlocked.Exchange
,至少以原子方式读/写它。我不确定您是否应该关心这些事情。以basic锁为例。它的用法类似于if(Monitor.TryEnter(myLock,ref locktake)try{…}finally{…}
,没有人认为如果在同一个“危险区域”抛出异常,锁就不会被释放。@Evk很好。感谢您的比较。如果C#不在乎,那么我就不在乎。)