【发布时间】:2013-07-18 16:29:24
【问题描述】:
这更像是一个概念问题的验证。我希望我没有违反关于 SO 的可接受问题规则。我尝试在答案线程上发表评论,但 SO 不允许我这样做。
从这个问题的公认答案开始,我也有这个问题 - Non blocking locking,
接受答案的选项 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 并执行代码的“做一些事情”部分
有没有办法使用这种范式来确保执行增量的线程是执行代码的线程?
【问题讨论】:
标签: c# .net multithreading