hwc*_*rwe 3 c# multithreading locking properties
我写了以下代码:
static readonly object failedTestLock = new object();
public static Dictionary<string, Exception> FailedTests
{
get
{
lock (failedTestLock)
{
return _failedTests;
}
}
set
{
lock (failedTestLock)
{
_failedTests = value;
}
}
}
public void RunTest(string testName)
{
try
{
//Run a test
}
catch (Exception exception)
{
// ?? Is this correct / threadsafe?
FailedTests.Add(testName, exception);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
这是否是将失败的测试安全地添加到词典中的正确方法?
这线程安全吗?
是FailedTests.Add调用INSIDE锁定还是OUTSIDE锁定?
你能解释为什么这是正确的/线程安全的,或者为什么不呢?
提前致谢
上面代码的基本问题是它只锁定_failedTests线程获取字典或设置字典时的访问权限.只有一个线程可以一次获得对字典的引用,但是一旦线程具有对字典的引用,它就可以读取和操作它而不受锁的约束.
这是将失败的测试安全地添加到字典中的正确方法吗?
不,如果两个线程同时尝试添加到字典中,请不要这样做.如果您希望读取和写入按特定顺序发生,也不会发生.
这线程安全吗?
这取决于你对线程安全的意思,但不是,不是任何合理的定义.
是FailedTests.Add调用INSIDE锁定还是OUTSIDE锁定?
字典检索(get访问器)发生在锁内.Add释放锁后,此代码调用.
你能解释为什么这是正确的/线程安全的,或者为什么不呢?
如果多个线程同时在您的字典上运行,则无法预测这些线程将更改其内容的顺序,并且您无法控制何时将进行读取.
这不是对字典的线程安全访问,因为只有返回字典对象的属性访问是线程安全的,但您没有同步对该Add方法的调用.ConcurrentDictionary<string,Exception>在这种情况下考虑使用,或Add手动同步呼叫.
| 归档时间: |
|
| 查看次数: |
5888 次 |
| 最近记录: |