gpt4 book ai didi

c# - 多线程:锁定属性 - 这是正确的吗?

转载 作者:行者123 更新时间:2023-11-30 13:10:40 25 4
gpt4 key购买 nike

我写了下面的代码:

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);
}
}

问题:
这是将失败的测试安全地添加到词典中的正确方式吗?
这是线程安全的吗?
FailedTests.Add 是在锁内调用还是在锁外调用?

你能解释为什么这是正确的/线程安全的还是为什么不正确?

提前致谢

最佳答案

上面代码的根本问题是它只在线程获取或设置字典时锁定对_failedTests 的访问。同一时刻只有一个线程可以获得对字典的引用,但是一旦一个线程获得了对字典的引用,它就可以读取和操作它而不受锁的约束。

Is this a correct manner to safely add the failed test to the Dictionary?

不,如果两个线程试图同时添加到字典中则不会。如果您希望读取和写入以特定顺序发生,也不会。

Is this threadsafe?

It depends what you mean by threadsafe ,但不,没有任何合理的定义。

Is FailedTests.Add called INSIDE the lock or OUTSIDE the lock?

字典检索(get 访问器)发生在锁内。此代码在释放锁后调用 Add

Can you explain why this is correct/threadsafe or why not?

如果多个线程同时对您的字典进行操作,您将无法预测这些线程更改其内容的顺序,并且您无法控制何时发生读取。

关于c# - 多线程:锁定属性 - 这是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com