volatile Task is completed和Integlocked之间的区别



作用域是访问方法T1和T2的目标应该是";优雅地";通知了一个异常而没有开始操作延迟另一个时间。

方法T1和T2中使用的方法之间有什么区别?特别是volatile应该确保最新的值,如果我没有错的话,用Interlocked.Exchange锁定整数值有什么区别?

async Task Delay(bool endOperation) {
try {
await Task.Delay(2000);
}
finally {
if (endOperation)
_ = Interlocked.Exchange(ref _lock, 0);
}
}
volatile Task _t = Task.Completed;
int _lock;
Exception NoConcurrent => new InvalidOperationException("no concurrent");
Task T1() {
if (!_t.IsCompleted) throw NoConcurrent;
var t = Delay(false);
_t = t;
return t;
}
Task T2() {
if (Interlocked.Exchange(ref _lock, 1) == 1) throw NoConcurrent;
return Delay(true);
}

方法T1和T2中使用的方法之间有什么区别?特别是volatile应该确保最新的值,如果我没有错,与用Interlocked锁定整数值有什么区别。交换

这里volatile的问题是在检查和集合之间有一些空间:

if (something checking _t)
...
_t = ...;

另一个线程可以在检查之后但在设置之前偷偷进入,并进行自己的检查和设置。然后你有两个跑步,每个人都认为自己是唯一一个。

Interlocked通过原子地检查集来处理此问题,而不存在另一个线程在这两者之间潜入的可能性。

最新更新