gpt4 book ai didi

c# - 在 C# 中处理竞争条件

转载 作者:太空狗 更新时间:2023-10-29 19:40:08 25 4
gpt4 key购买 nike

我正在编写一个带有分层通信接口(interface)的应用程序。
这样做是为了从应用程序的用户界面部分抽象通信,并使其更具可扩展性/可维护性。
例如:

alt text

将上图中的每个框视为一个单独的类。
通用通信接口(interface)填充描述交易数据和通信“健康”的字符串变量,这些变量又通过一系列公共(public)函数调用复制到应用程序。例如,应用程序将调用 App-Sub-System:

class Application
{
private void SomeUpdateFunction()
{
this.textBox1.AppendText(this.AppSubSystem.GetText());
}
}

class AppSubSystem
{
public string GetText()
{
return this.GenericCommsInterface.GetText();
}
}

class GenericCommsInterface
{
public string GetText()
{
string sRetVal = this.sText; // sText is populated by other functions in the class.
this.sText = null; // Suspected race condition is here.
return sRetVal;
}
}

sText 由类中的其他函数异步填充。
我相信 string sRetVal = this.sText; 和下一行 this.sText = null; 之间发生了竞争条件。
有人可以建议避免或防止这种竞争状况的方法吗?使用 StringBuilder 会有帮助吗,或者我应该使用另一种方法吗?

最佳答案

在更新它的函数以及 GetText 函数中,您应该在任何时候想要触摸 this.sText 时获取锁。这将确保一次只有一个线程在干扰它,因为(假设你的线程有锁)其他线程将坐下来等待当前线程完成。

我建议您使用 StringBuilder,部分是为了简化锁定,因为锁定恰好被驻留的字符串,或者在锁定操作的中间切换出来的字符串(从局外人的角度来看,因此被解锁)可能会导致真正糟糕的魔力。这样的事情会有所帮助:

lock (this.sbText)
{
sRetVal = this.sbText.ToString();
this.sbText.Length = 0;
}

或者,您可以锁定this,但这很丑陋——您的锁应该在里面,尽可能私密,以避免奇怪的副作用(就像其他一些对象试图获取此对象的锁——当 sbText 被更改时它不能这样做)。

关于c# - 在 C# 中处理竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303961/

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