강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

젓인님의 프로필 이미지
젓인

작성한 질문수

리눅스 시스템 프로그래밍 - 이론과 실습

쓰레드 개념, 쓰레드 생성/종료/조인/동기화 - 라이브 프로그래밍

shared는 왜 0이 아닌 값들이 나오는거죠?

작성

·

160

0

mutex lock을 하지 못해서 순서가 뒤죽박죽이어도 결국 20000번씩 진행을 하고 끝나니까 0이 되지 않나요?

동영상을 다시 보니까 헷갈리네요

답변 3

0

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

도움이 되셨다니 다행입니다~~ :)

0

젓인님의 프로필 이미지
젓인
질문자

바로 그림을 보는 순간 떠올랐습니다. 감사합니다 :)

0

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

전역변수 shared에 대해 동기화가 없는 상태에서, 한 쓰레드의 동작이 다른 쓰레드에 의해 방해를 받기 때문에 엉뚱한 값이 저장되는 것입니다. 

그림으로 정상/비정상 케이스를 표현해보았어요.

정상 동작 케이스에서는 Thread A와 B가 각각 +1을 해서 결과적으로 +2가 될 것입니다. 말 그대로 정상 동작이지요.

그런데 비정상 동작 케이스를 보시면, Thread A/B가 모두 동작을 마쳐도 결과적으로 +1만 될 것입니다. 두 쓰레드 모두 하나의 값을 메모리에서 읽어와 +1씩 하고 메모리에 다시 저장하게 되기 때문입니다.

동기화가 제대로 되지 않으면 이런 식으로 데이터가 깨지게 됩니다.

 

# 정상 동작 케이스
 |      Thread A                              |      Thread B
-+--------------------------------------------|------------------------------------------
 |   메모리에서 shared의 값을 읽어온다.       |
 |   shared + 1을 계산한다.                   |
 |   계산된 결과를 메모리에 저장한다.         |
 |                                            |
 |                                            |   메모리에서 shared의 값을 읽어온다.
 |                                            |   shared + 1을 계산한다.
 |                                            |   계산된 결과를 메모리에 저장한다.
 |
 v
time

# 비정상 동작 케이스
 |      Thread A                              |      Thread B
-+--------------------------------------------|------------------------------------------
 |   메모리에서 shared의 값을 읽어온다.       |
 |                                            |   메모리에서 shared의 값을 읽어온다.
 |   shared + 1을 계산한다.                   |
 |   계산된 결과를 메모리에 저장한다.         |
 |                                            |   shared + 1을 계산한다.
 |                                            |   계산된 결과를 메모리에 저장한다.
 |
 v
time
젓인님의 프로필 이미지
젓인

작성한 질문수

질문하기