gpt4 book ai didi

c# - 如何激发对共享资源的同时访问?

转载 作者:行者123 更新时间:2023-11-30 12:48:59 25 4
gpt4 key购买 nike

我正在创建一个对输入执行顺序处理的组件。因为它将托管在几个不同的进程中,所以我需要它是线程安全的。起初,我故意在代码中忽略了线程安全。现在是介绍它的时候了。

首先,我想引发一个错误,但未能成功。这是处理引擎代码的简化版本:

public Document DoOrchestration(Document input)
{
Document output = new Document();

foreach (var orchestrationStep in m_OrchestrationSteps)
{
var processor = GetProcessor(orchestrationStep).Clone();

output = processor.Process(input);

input = output;
}

return output;
}

处理器可以由我组织中的其他人开发,并且可以包括一些复杂的初始化。它们也可能是线程不安全的,因此我使用原型(prototype)模式来获取 的唯一实例,以避免其中出现线程问题。

为了测试此功能,我使用了以下代码:

for (int i = 0; i < 20000; i++)
{
Thread t = new Thread(() => TestOrchestration(i));
t.Start();
}

void TestOrchestration(int number)
{
Document doc = new Document(string.Format("Test {0}", number));
doc = DoOrchestration(doc);
if (doc.ToString().Substring(0,35) != strExpectedResult)
{
System.Console.WriteLine("Error: {0}", doc.ToString();
}
}

我预计某些线程会与另一个线程发生冲突并混淆它们的结果,但令我惊讶的是这并没有发生。

对此可能有一个简单而合乎逻辑的解释,但它让我难以理解。或者只是代码太简单导致两个线程同时摆弄输入/输出变量?

最佳答案

查看 CHESS .

CHESS is a tool for finding and reproducing Heisenbugs in concurrent programs. CHESS repeatedly runs a concurrent test ensuring that every run takes a different interleaving. If an interleaving results in an error, CHESS can reproduce the interleaving for improved debugging. CHESS is available for both managed and native programs.

关于c# - 如何激发对共享资源的同时访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12968559/

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