2012-07-24 5 views
1

대부분의 경우 스레딩이 필요한 응용 프로그램이 있습니다. 대부분의 경우 객체가 각 스레드에 대해 실행되기 전에 업데이트되었으므로 오류 또는 잘못된 값이 발생합니다.개체를 C#에서 Threadsafe로 만드는 방법은 무엇입니까?

개체를 스레드로부터 안전하게 보호하고 개체가 각 스레드에 대해 올바른지 확인하는 방법에 대한 제안이 있습니까? 변수를 static으로해야합니까?

+3

먼저 책으로 시작해야합니다. 일반적으로 멀티 프로세싱은 옳은 일을하는 것이 어렵습니다. –

답변

4

스레드 안전성을 확보해야하는 모든 리소스에 대해 lock 문을 사용하십시오.

class Account 
{ 
    decimal balance; 
    private Object thisLock = new Object(); 

    public void Withdraw(decimal amount) 
    { 
     lock (thisLock) 
     { 
      if (amount > balance) 
      { 
       throw new Exception("Insufficient funds"); 
      } 
      balance -= amount; 
     } 
    } 
} 

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

내 첫 단계가 될 것입니다. 또한 Monitor 클래스를 살펴볼 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.threading.monitor.aspx

는 동시 작업하는 동안 자원을 보호 할 수있는 두 가지 기본 방법입니다. mutexes, sempahores, 조건부 읽기/쓰기 잠금 등과 같은 다른 많은 방법이 있습니다.

1
은 여기에서 시작

: Synchronizing Data for Multithreading

기본적으로, 당신은 mutex를 사용해야합니다. .NET에서 모든 객체는 뮤텍스로 작동 할 수 있으므로 모든 객체에서 lock keyword을 사용하여 상호 배제를 보장 할 수 있습니다. 당신이해야

14

우선 그래프는 멀티 스레딩에 의해 해결하고자하는 문제의-전에 어떻게됩니까 그릴입니다. 디자인을 그릴 수 없다면 너무 복잡합니다.

예를 들어, 이것은 int의 두 배열을 취하여 모든 요소의 합계를 출력하는 메소드의 발생 전 그래프입니다. 당신이 다른 것을하기 전에 발생하는 것을보고 정말 간단하지만, 더 중요한 것은 다른 것을하기 전에 일이없는 무엇을 보여줍니다 당신의 일이-전에 그래프가 있으면

enter image description here

.

이 예에서는 array1과 array2의 합계를 동시에 얻을 수 있습니다. 서로 의존하지 않으므로 sum1을 sum2와 동시에 얻을 수도 있습니다. 합계를 TotalSum1에 추가하는 작업은 두 가지 순서로 수행 할 수 있습니다 (단, 추가 작업은 다른 작업과 동시에 수행 할 수 없기 때문에 추가 작업 단계를 잠글 필요가 있습니다).

C# .net 4.0에는 병렬 프로그래밍에 유용한 많은 기능이 있습니다.

나는이 책을 추천합니다 Parallel Programming with Microsoft .Net - 왼쪽에있는 책갈피를 사용하여 탐색하십시오. 루프, 태스크, 집계, 선물 및 파이프 라인의 병렬 패턴을 다룹니다.

위 예제에서 Task1을 사용하여 Array1과 Task2를 가져 와서 Array2를 얻은 다음 두 경우 모두 배열 합계에 대해 Parallel.For 루프에 내장 된 집계 패턴을 사용합니다. 잠금 또는 Interlocked.Add를 사용하여 하위 합계를 누적 한 다음 작업이 완료 될 때까지 기다린 후 결과를 반환해야합니다.

유용한 패턴 :

  • 작업
  • 병렬 루프
  • 생산자/소비자
  • 파이프 라인
  • 작업리스트
  • 맵리 듀스

유용한 도구 :

  • 작업 병렬 라이브러리
    • Parallel.For
    • Parallel.Foreach,
    • 작업
  • PLINQ
  • 동시 데이터 구조체
    • '잠금'키워드
    • 모니터
    • 세마포어 ('잠금'와 같은 기능)
    • 스핀 락
    • 잠금3210
      • ConcurrentQueue
    • 읽기/쓰기 잠금
  • 하드웨어 원자력 운영
    • Interlocked.Increment
    • Interlocked.Add
    • Interlocked.CompareAndSwap INT
  • 메시지와 같은 기계 워드 길이 변수에
  • 할당이 전달
    • MPI
    • 장벽

기본적으로, 패턴 그것을 해결하기 위해 /를 도구를 선택한 다음 첫 문제를 이해 등.

관련 문제