C# 多线程:锁定属性-是否正确?
我编写了以下代码:C# 多线程:锁定属性-是否正确?,c#,multithreading,properties,locking,C#,Multithreading,Properties,Locking,我编写了以下代码: static readonly object failedTestLock = new object(); public static Dictionary<string, Exception> FailedTests { get { lock (failedTestLock) { return _failedTests; } } set {
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);
}
}
static readonly object failedTestLock=new object();
公共静态字典失败测试
{
得到
{
锁定(失败测试锁定)
{
返回失败的测试;
}
}
设置
{
锁定(失败测试锁定)
{
_失败测试=数值;
}
}
}
公共void RunTest(字符串testName)
{
尝试
{
//进行测试
}
捕获(异常)
{
//??这是否正确/螺纹安全?
FailedTests.Add(testName,异常);
}
}
问题:这是将失败的测试安全添加到字典的正确方式吗?
这是线程安全的吗?
是否在锁内或锁外调用FailedTests.Add 您能解释一下为什么这是正确的/线程安全的还是不正确的吗
提前感谢这不是对字典的线程安全访问,因为只有返回字典对象的属性访问是线程安全的,但是您没有同步对
Add
方法的调用。在这种情况下,请考虑使用<代码> CONTURNECTORION < /COD>,或者手动调用“代码> >添加< /代码>。< /P> < P>t认为这是线程安全的,因为锁只在返回集合指针的非常短的时间内保持。当您添加到集合时,没有锁,因此如果两个线程同时尝试添加,您将得到一个严重的错误。
所以你应该锁定失败的测试。添加代码
您可能还想查看并发集合,它们可能会提供您所需要的
关于GJ,上面代码的基本问题是,当线程获取或设置字典时,它仅锁定对
\u failedTests
的访问。一次只能有一个线程获得对字典的引用,但一旦一个线程拥有对字典的引用,它就可以读取和操作字典,而不受锁的约束
这是安全添加的正确方式吗
字典的失败测试
不,如果两个线程试图同时添加到字典中,则不会。如果您希望读写操作以特定的顺序进行,也不会发生
这是线程安全的吗
,但没有,没有任何合理的定义
是失败的测试。在
锁还是锁外
字典检索(getaccessor)发生在锁中。此代码在释放锁后调用Add
您能解释一下为什么这是正确的/线程安全的还是不正确的吗
如果多个线程同时对词典进行操作,则无法预测这些线程更改其内容的顺序,也无法控制何时进行读取。对Add()
的调用不在锁定范围内
< >您可以通过编写自己的Addio.()方法来解决它,以替换属性。如果您这样做,顺便考虑一下,请使用<代码> Read RealSerkSimulm < /C> >,对不起,如果我问得太晚的话。但是,如果我们把(这个)同时锁定在getter和setter上会怎么样?这难道不应该以一种简单的方式保证完整的线程安全性吗?按照定义的顺序获取和设置?@icbytes-不,这对一点都没有帮助。然后解释一下,为什么。锁确保一次只能读取或写入一个线程,因此从理论上讲,这听起来是线程安全的。