나는 계층화 된 통신 인터페이스로 애플리케이션을 작성하고 있습니다.
이것은 응용 프로그램의 사용자 인터페이스 부분에서 통신을 추상화하고 더 확장 성/유지 보수성을 높이기 위해 수행되었습니다. 예를 들어
:C#의 레이스 조건 처리
위에 별도의 클래스로 그림에서 각 상자를 생각해 보자.
일반 Comms 인터페이스는 트랜잭션 데이터를 설명하는 문자열 변수를 채우고 일련의 공용 함수 호출을 통해 응용 프로그램에 복사되는 "상태"를 전달합니다.
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
도움말을 사용 하시겠습니까? 아니면 내가이 작업을 수행해야하는 다른 방법이 있습니까? 당신의 세트
lock(someObject)
{
//...
this.sText = value;
}
스레드 접근에서 안정적이지 않을 것이라는 보장이없는 객체에 '잠그는'것은 매우 좋지 않습니다. 잠금은 모든 사람들이 사용해야한다는 점에서 '권고'입니다. 잠금 개체를 계속 변경하기 때문에 잠금 개체를 포함하는 변수를 null로 설정하여 특히 바람직하지 않습니다. –
좋은 지적.StringBuilder를 사용하는 또 다른 이유. – cHao
팁 주셔서 감사합니다! 나는'private string sText'를'private StringBuilder cText'로 대체하고 잠금을 구현했습니다. 그것은 위대한 작품! 경쟁 조건이 사라졌습니다. 명성! –