쓰레드의 공유 데이터 문제에 대해 설명하기전 밑에 코드를 보고 타이핑 하고
실행해보자 ~
우리가 thread라는 것은 프로세스내에 새로운 독립적인 흐름을 만든다고 배웠다.
t1 쓰레드의 for문 1000번 t2 쓰레드의 for문 1000번으로 test_value라는 전역변수의 값이 2000이 되야 정상이다.
하지만 위에코드를 실행시켜 보면 정상적으로 값이 나올때가 있고 안나올때가 있을것이다.
코드레밸에서는 단순하게 값을 증가시키는 한줄만 실행되는거 같지만 디버깅 후 디스어셈블리 모드를
실행해보면 이렇게 나온다.
00A42AA3 mov eax,dword ptr [test_value (0A4D2D0h)]
00A42AA8 add eax,1
00A42AAB mov dword ptr [test_value (0A4D2D0h)],eax
간략하게 설명한다면 ptr[test_value(0A4D2DOh)] 에서 eax 레지스터로 이동하고
eax레지스터에 있는 값에 1을 더하고 다시 eax레지스터의 값을 ptr[test_value(0A4D2DOh)] 로 이동한다.
이런 값의 증가방식이 왜 문제가 되느냐? 예를들어 t1 쓰레드가 실행되어 test_value값이 100일때
100의 값이 eax에 이동되고 1을 더해 101이되고 다시 test_value에 이동시키기전에
t2쓰레드가 test_value값을 가지고오면 연산을 test_value t1실행전 이전값인 100으로 하게되고
이것을 test_value에 이동하게된다. 우리가 생각한 t1,t2 한번씩 실행했을경우 결과값인 102 아닌
최종적인값은 101되게된다.
이러한 문제는 쓰레드가 test_value라는 전역변수(공유변수)의 다른 쓰레드의 접근을 신경쓰지않고
값을 처리하기때문에 이러한 문제가 발생한다.
다음 챕터에서는 이러한 문제를 해결하기 위한 여러한 기법에 대해서 글을 작성할 예정입니다.
'프로그래밍 > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 스터디 1일차 (0) | 2022.07.31 |
---|---|
C# GroupBox 내 선택된 RadioButton 값 찾기 (0) | 2021.05.29 |