안녕하세요, C#을 열심히 공부하고 있는 초록물꼬기라고 합니다.
멀티쓰레딩을 공부하다가 예전에 얼핏 보았던 Parallel Class 를 한번 심도있게 공부해보고자 하는데 도저히 이해를 못하는 부분이 있어서 도움을 청하고자 질문을 드립니다.
일단 질문드릴 간단한 소스코드를 써보겠습니다.
int n = 0;
Parallel.For(0, 100, (i) =>
{
n++;
Console.WriteLine(n);
});
Parallel.For 가 멀티쓰레드로 이 코드를 돌린다고 처음 알았을 때 당연히 n 에 대한 동기화 문제가 발생할거라고 생각했습니다.
하지만 몇번을 돌려도, 중간 인자를 10000으로 늘려도 동기화 문제는 발생하지 않았습니다.
이부분에 대해서 좀 찾아본 결과 Data Parallelism 에 의해 대량의 데이터에 대해 CPU에게 적당히 일감을 나눠준다고 하는데..(
http://www.csharpstudy.com/Threads/parallel.aspx)
일단 MSDN 에서도 스레드로부터의 안정성을 All public and protected members of Parallel are thread-safe and may be used concurrently from multiple threads. 라고 명시한 걸로 봐서
(
https://msdn.microsoft.com/ko-kr/library/system.threading.tasks.parallel(v=vs.110).aspx)
따로 동기화를 해줄 필요는 없구나! 싶었습니다.
사실 개개의 Thread 에 lock 을 걸어야 한다면 멀티코어의 이점이 엄청 사라질 수 있으니 당연히 장치는 해 두었을거라고 생각합니다.
하지만 중간에 Sleep 를 넣으면.. 즉
int n = 0;
Parallel.For(0, 100, (i) =>
{
Thread.Sleep(500);
n++;
Console.WriteLine(n);
});
이 코드에서는 n 을 출력한 가장 큰 값이 98 ~ 101 까지 다양했습니다. (제 CPU가 4코어 하이퍼쓰레드라 그런지 값은 8개씩 나옵니다)
즉 동기화 문제가 발생했다는건데(첨부파일 참조)
악보 재생을 Parallel.Invoke() 를 이용해서 하려고 했는데 음악의 속도(BPM)에 따라서 Sleep 는 필연적으로 사용해야 하기 때문에 굉장히 망설여지고 있습니다..
혹여나 제가 MSDN 문서에 대해 좀 잘못 이해하고 있는것 같기도 한데.. 위의 동기화 문제는 왜 발생하게 되는걸까요?
[최초 등록일: ]
[최종 수정일: 1/6/2016]