【发布时间】:2018-07-04 15:15:21
【问题描述】:
我为集成测试编写了下面的代码,它为几个不同的程序集调用昂贵的函数 DoSomething()。我原以为应用锁足以确保线程安全,但有时布尔值在我当前的测试用例中应该始终为假时为真。
我还尝试了带有 Interlocked.CompareExchange 的解决方案 here,这似乎对我也不起作用。
有人可以指出我到底做错了什么吗?
public class SomeClass
{
private object _lock = new object();
private volatile bool _isSuccessful = true;
private bool IsSuccesful
{
get
{
lock (_lock)
{
return _isSuccessful;
}
}
set
{
lock (_lock)
{
_isSuccessful = value;
}
}
}
public bool Get()
{
Parallel.ForEach(..., ... =>
{
IsSuccesful = IsSuccesful & DoSomething();
});
return IsSuccesful;
}
}
【问题讨论】:
-
你能把它变成一个可验证的失败例子吗?
-
这不只是让您获得
IsSuccesful的last 值吗,并且当您并行运行多个任务时,您不知道哪个是最后一个运行? -
@stuartd 这是一个测试项目:github.com/bdebaere/ThreadSafeBool/tree/master/ThreadSafeBool
-
不确定您要在这里做什么。如果您只想知道其中是否有任何失败,为什么不在任务失败时设置
Failed属性? -
@stuartd 你能解释一下你的意思吗?我认为这是一个实现:我根据任务结果设置的布尔值。
标签: c# multithreading thread-safety