대부분의 경우 스레딩이 필요한 응용 프로그램이 있습니다. 대부분의 경우 객체가 각 스레드에 대해 실행되기 전에 업데이트되었으므로 오류 또는 잘못된 값이 발생합니다.개체를 C#에서 Threadsafe로 만드는 방법은 무엇입니까?
개체를 스레드로부터 안전하게 보호하고 개체가 각 스레드에 대해 올바른지 확인하는 방법에 대한 제안이 있습니까? 변수를 static
으로해야합니까?
대부분의 경우 스레딩이 필요한 응용 프로그램이 있습니다. 대부분의 경우 객체가 각 스레드에 대해 실행되기 전에 업데이트되었으므로 오류 또는 잘못된 값이 발생합니다.개체를 C#에서 Threadsafe로 만드는 방법은 무엇입니까?
개체를 스레드로부터 안전하게 보호하고 개체가 각 스레드에 대해 올바른지 확인하는 방법에 대한 제안이 있습니까? 변수를 static
으로해야합니까?
스레드 안전성을 확보해야하는 모든 리소스에 대해 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, 조건부 읽기/쓰기 잠금 등과 같은 다른 많은 방법이 있습니다.: Synchronizing Data for Multithreading
기본적으로, 당신은 mutex를 사용해야합니다. .NET에서 모든 객체는 뮤텍스로 작동 할 수 있으므로 모든 객체에서 lock keyword을 사용하여 상호 배제를 보장 할 수 있습니다. 당신이해야
우선 그래프는 멀티 스레딩에 의해 해결하고자하는 문제의-전에 어떻게됩니까 그릴입니다. 디자인을 그릴 수 없다면 너무 복잡합니다.
예를 들어, 이것은 int의 두 배열을 취하여 모든 요소의 합계를 출력하는 메소드의 발생 전 그래프입니다. 당신이 다른 것을하기 전에 발생하는 것을보고 정말 간단하지만, 더 중요한 것은 다른 것을하기 전에 일이없는 무엇을 보여줍니다 당신의 일이-전에 그래프가 있으면
.
이 예에서는 array1과 array2의 합계를 동시에 얻을 수 있습니다. 서로 의존하지 않으므로 sum1을 sum2와 동시에 얻을 수도 있습니다. 합계를 TotalSum1에 추가하는 작업은 두 가지 순서로 수행 할 수 있습니다 (단, 추가 작업은 다른 작업과 동시에 수행 할 수 없기 때문에 추가 작업 단계를 잠글 필요가 있습니다).
C# .net 4.0에는 병렬 프로그래밍에 유용한 많은 기능이 있습니다.
나는이 책을 추천합니다 Parallel Programming with Microsoft .Net - 왼쪽에있는 책갈피를 사용하여 탐색하십시오. 루프, 태스크, 집계, 선물 및 파이프 라인의 병렬 패턴을 다룹니다.
위 예제에서 Task1을 사용하여 Array1과 Task2를 가져 와서 Array2를 얻은 다음 두 경우 모두 배열 합계에 대해 Parallel.For 루프에 내장 된 집계 패턴을 사용합니다. 잠금 또는 Interlocked.Add를 사용하여 하위 합계를 누적 한 다음 작업이 완료 될 때까지 기다린 후 결과를 반환해야합니다.
유용한 패턴 :
유용한 도구 :
기본적으로, 패턴 그것을 해결하기 위해 /를 도구를 선택한 다음 첫 문제를 이해 등.
먼저 책으로 시작해야합니다. 일반적으로 멀티 프로세싱은 옳은 일을하는 것이 어렵습니다. –