문제

내가 쓰고있는 응용 프로그램에서는 많은 기본 유형을 작성해야합니다. 그러나 나는 돌연변이 유형이 어떻게 병렬 응용 프로그램에서 불변의 응용 프로그램에서 비교하는지 궁금합니다.

변이 가능한 물체와 함께 잠금을 사용할 수 있습니까? 병렬 응용 프로그램에서 불변 유형과 함께 사용되는 다른 기술과 어떻게 비교됩니까?

당신은 적어도 불변의 유형의 자물쇠를 사용하지 않습니까?

도움이 되었습니까?

해결책

유형

  • 불변의 유형을 가능한 한 많이 사용하십시오.
  • 가능한 한 명백한 잠금 대신 스레드 안전 컬렉션을 사용하십시오.
  • 다른 합리적인 선택이없는 경우에만 돌연변이 유형을 사용하십시오.

스레드

  • 실 풀을 가능한 한 많이 사용하십시오.
  • 스레드 풀이 불가능할 때 끝없는 루프를 사용하십시오.
  • 마지막 수단으로 스레드를 수동으로 시작하고 중지합니다.

명시 적 잠금 장치를 사용해야한다면 문서화하십시오. 특히 객체를 잠그는 순서에있어서. FOO 객체가 막대 개체 전에 항상 잠겨 있고 FOO (키 100)가 FOO (키 = 200) 전에 항상 잠겨 있다는 것을 알고 있다면 교착 상태가되지 않습니다.

다른 팁

병렬화 가능한 응용 프로그램을 작성하는 열쇠는 변이 가능한 공유 상태를 멀리하는 것입니다. 스레드간에 돌연변이 상태를 공유하려면 동기화가 필요하며 일반적으로 어떤 형태의 잠금이 수반됩니다. 불변의 유형을 사용하면 실수로 상태를 공유하지 않아도 해당 객체의 상태를 변경할 수 없습니다. 그러나 이것은 마법의 총알이 아니라 단순히 디자인 선택입니다. 병렬화하려는 알고리즘에 공유 상태가 필요하면 일종의 동기화를 만들어야합니다.

돌연변이는 잠금에 영향을 미치지 않습니다.

Mutable 유형을 사용하면 쓰기 후 읽기 또는 쓰기 후 쓰기 오류에 노출됩니다. 다른 스레드는 동시에 값을 읽거나 업데이트하는 반면 값을 업데이트하는 것과 관련된 동기화 오류입니다.

동기화 오류를 방지하려면 어떤 형태의 잠금 메커니즘을 사용해야합니다. 명시 적 잠금을 사용하는 경우 자물쇠 획득 순서에 대해 매우주의해야합니다. 조심하지 않으면 교착 상태를 소개 할 수 있습니다. 예를 들면 : a 스레드 A가 잠금 x를 획득 한 다음 스레드 B는 잠금 Y를 획득합니다. a weend 나중에 a requests le wock y 및 스레드 B가 잠금 x를 요청합니다. 이로 인해 두 스레드는 해제되지 않을 잠금 장치에 대해 무기한 대기합니다.

잠금을위한 두 가지 좋은 경험 규칙 :

  • 특정 순서로 잠금을 획득하십시오 (예 : 항상 잠금 X를 획득하기 전에 잠금 y)
  • 가능한 한 짧은 시간 동안 잠금 장치를 잡습니다. 필요할 때 그것들을 구입하고 당신이 끝나 자마자 풀어주십시오.

창조 후 물체에 글을 쓰지 않으면 액세스하기 전에 잠금 할 필요가 없습니다. 따라서 불변의 물체를 잠글 필요는 없습니다.

가능하면 불변 유형을 사용하십시오. (직렬화 등)가 필요할 때 변한 유형을 사용하십시오.

모든 병렬화에 대한 system.threading.tasks- 키워드가 추가 될 때 C# 5의 언어로 작업을 구축 할 수 있습니다.

C#에 변한 / 불변 유형에 관한 기사를 썼습니다. http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-immutable-en-a-parallel-world/

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