这更多是对概念问题的验证。我希望我没有违反关于 SO 的可接受问题规则。我尝试对答案线程发表评论,但 SO 不允许我这样做。
从这个问题的公认答案开始,我也有一个问题 -非阻塞锁定,
已接受答案的选项 2 是这样的:
private int _inUseCount;
public void MyMethod()
{
if (Interlocked.Increment(ref _inUseCount) == 1)
{
// do some stuff
}
Interlocked.Decrement(ref _inUseCount);
}
似乎执行增量的线程不一定是执行代码的“//做一些事情”部分的线程。
考虑这种情况:
- ThreadA 将 _inUseCount 增加到 1 并挂起
- ThreadB 将 _inUseCount 增加到 2 并挂起
- ThreadA 恢复并看到 _inUseCount 等于 2,不执行代码的“做一些事情”部分,将 _inUseCount 递减为 1 并完成
- ThreadB 恢复并看到 _inUseCount 为 1 并执行代码的“做一些事情”部分
有没有办法使用这个范例来确保执行增量的线程是执行代码的线程?