본문 바로가기
/윈도우 프로그래밍

Thread- 1.쓰레드 공유 데이터 문제

by 개발하는군인 2022. 1. 1.

 

쓰레드의 공유 데이터 문제에 대해 설명하기전 밑에 코드를 보고 타이핑 하고

실행해보자 ~ 

 

 우리가 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라는 전역변수(공유변수)의  다른 쓰레드의 접근을 신경쓰지않고

값을 처리하기때문에 이러한 문제가 발생한다. 

 

 

다음 챕터에서는 이러한 문제를 해결하기 위한 여러한 기법에 대해서 글을 작성할 예정입니다.