멀티 스레드 애플리케이션에서 공유 데이터 찾기 / 피하기 규칙

StackOverflow https://stackoverflow.com/questions/618216

  •  03-07-2019
  •  | 
  •  

문제

hy,

우리 모두가 알고 있듯이 멀티 스레딩 응용 프로그램을 개발하는 것은 어려운 일입니다. 특히 언제, 무엇을 잠금 해야할지 요점은 그다지 명백하지 않습니다. 종종 메소드 / 클래스를보고 있으며 여러 스레드로 수정할 수있는 데이터를 공유하는 경우 스스로에게 물어봐야합니다. 그리고 그것이 확실하지 않은 경우 전체 코드 블록에서 잠금 ()로 끝납니다.

그래서 내가 알고 싶은 것은 : 공유 데이터를 식별하기 위해 패턴 / 규칙 등에 대한 제안이 있습니까? 또는 코드가 스레드 안전인지 확인하는 기술.

예 :

  • 정적 메소드는 클래스 필드를 수정해서는 안됩니다. (그들이 현장을 잠그지 않는 한.)
  • 메소드의 참조 유형 매개 변수는 "직접"전달되지 않아야합니다. 항상 복제를 통과하십시오.

그런데:

Microsoft Research가 진행 중입니다 체스. 동시 프로그램에서 Heisenbugs를 찾고 재생하는 도구. 나는 이것과 PLINQ가 동시 프로그램의 개발을 향상시키기를 바랍니다.

도움이 되었습니까?

해결책

가능하면 유형을 불변으로 시작하십시오. 그런 다음 복제 할 필요가 없습니다. 객체의 내용을 "변경"해야하는 경우 메소드를 대신 새 개체를 반환하도록하십시오. String.Replace 기타.

이것은 기본적으로 기능적 프로그래밍 스타일이며 사랑 스럽습니다. 불행히도 우리가 (현재) .NET 프레임 워크에 불변의 컬렉션을 내장하지는 않지만 주변에 타사가 있지만. 우리 자신의 Jaredpar에 의해 하나를 포함합니다.

다른 팁

클래스에서 데이터를 캡슐화하면 스레드를 안전하게 만들 때 유용합니다. 데이터에 액세스하는 방법을 제어 할 수 있으며 응용 프로그램 전체에 코드를 사용하여 올바르게 동기화하려고 시도하는 대신 동기화에 대한 클래스가 클래스를 동기화 할 수 있습니다.

또한 잠금 식별자로 사용할 수있는 개인 변수를 넣을 수있는 곳이있어 데이터 자체를 잠금의 식별자로 사용하지 않을 수 있습니다. 잠금 식별자로 전용 개인 변수를 사용하면 가능한 교착 상태를 하나씩 제거합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top