Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程:锁定属性-是否正确?_C#_Multithreading_Properties_Locking - Fatal编程技术网

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-不,这对一点都没有帮助。然后解释一下,为什么。锁确保一次只能读取或写入一个线程,因此从理论上讲,这听起来是线程安全的。