Обработка условий гонки в C#
Я пишу приложение с многоуровневым интерфейсом связи.
Это было сделано, чтобы абстрагировать сообщения от части пользовательского интерфейса приложения, а также сделать его более масштабируемым/обслуживаемым.
Например:
рассмотреть каждую коробку на рисунке выше как отдельный класс.
Универсальный интерфейс Comms заполняет строковые переменные, описывающие транзакционные данные и "работоспособность" comms, которые, в свою очередь, копируются к приложению через ряд публичных функций. Например, приложение сделает вызов 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
помогите, или есть другой способ, которым я должен это делать?
3 ответов
вы, вероятно, должны приобретать замок в любое время, когда вы хотите коснуться this.sText
-- в функциях, которые обновляют его, а также ваш
этот код, безусловно, не будет работать в потоковой среде, поскольку вы не защищаете sText. Вы должны запереть всех, кто имеет к нему доступ.
public string GetText()
{
lock( someObject )
{
string sRetVal = this.sText; // sText is populated by other functions in the class.
this.sText = null; // Suspected race condition is here.
return sRetVal;
}
}
в наборе
lock( someObject )
{
//...
this.sText = value;
}