sta*_*ica 8 .net c# multithreading interlocked compare-and-swap
我正在尝试编写一个只能调用一次的线程安全方法(每个对象实例).如果之前已调用异常,则应抛出异常.
我想出了两个解决方案.他们都是正确的吗?如果没有,他们有什么问题?
用lock:
public void Foo()
{
lock (fooLock)
{
if (fooCalled) throw new InvalidOperationException();
fooCalled = true;
}
…
}
private object fooLock = new object();
private bool fooCalled;
Run Code Online (Sandbox Code Playgroud)public void Foo()
{
if (Interlocked.CompareExchange(ref fooCalled, 1, 0) == 1)
throw new InvalidOperationException();
…
}
private int fooCalled;
Run Code Online (Sandbox Code Playgroud)
如果我没有弄错的话,这个解决方案具有无锁的优点(在我的情况下似乎无关紧要),并且它需要更少的私有字段.
我也愿意接受合理的意见,哪些解决方案应该是首选的,并且如果有更好的方法可以提出进一步的建议.
您的Interlocked.CompareExchange解决方案看起来最好,并且(正如您所说)是无锁的.它也比其他解决方案复杂得多.锁是非常重量级的,而CompareExchange可以编译成单个CAS cpu指令.我说跟那个一起去.
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |