我有一个可以从许多线程调用的类。 就像这样:
internal sealed class ThreadLocalMarker : IDisposable
{
[ThreadStatic]
private static int _counter;
private bool _disposed;
public ThreadLocalMarker()
{
_counter++;
}
public static bool Entered => _counter > 0;
public void Dispose()
{
if (_disposed)
{
return;
}
_counter--;
_disposed = true;
}
}
ThreadStatic变量_counter用于创建一个计数器变量,该变量将分配给调用该类的每个线程。
现在我已经进行了这样的单元测试
[Test]
public void SingleThreadReadsCorrectValue()
{
using (new ThreadLocalMarker())
{
Assert.IsTrue(ThreadLocalMarker.Entered);
}
Assert.IsFalse(ThreadLocalMarker.Entered);
}
第二个断言始终失败。
我的朋友建议,这可能是因为尽管在使用退出后将调用Dispose,但计数器值并未及时增加,因为处理器会重新排序操作以进行优化,因此,当调用Entered时,_counter的值仍不会减少。
他建议我在Dispose()中写这个:
Thread.VolatileWrite(ref _counter, _counter - 1);
问题2和3的一些代码示例对我来说将是额外的收获!