shared는 왜 0이 아닌 값들이 나오는거죠?
162
작성한 질문수 158
mutex lock을 하지 못해서 순서가 뒤죽박죽이어도 결국 20000번씩 진행을 하고 끝나니까 0이 되지 않나요?
동영상을 다시 보니까 헷갈리네요
답변 3
0
전역변수 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
inotify 객체에 등록된 watch descriptor 해제 관련 질문
0
37
2
select API 실습 코드 질문
0
41
2
wsl에서 fcntl사용
0
73
2
inotify_event 구조체 질문 [파일 이벤트 - 라이브 프로그래밍]에서...
0
180
2
./stat 파일이름
0
273
2
fopen r, r+모드 차이
0
460
2
강의를 모두 수강하고 스스로 구현하면 좋을 과제나 프로젝트 주제가 있을까요?
0
326
1
pthread 질문
0
419
2
I/O Multiplexing(select) 질문
0
325
1
inotify.c. ret 질문
0
302
1
inotify.c 질의합니다.
1
317
1
child process
0
715
1
read/blocking
0
565
1
flock
0
565
1
system call
0
598
1
pthread_create() 함수 이용했을 때, thread가 두번 호출되는 것 처럼 나타납니다. 왜 그런것인가요?
0
487
1
fork() 함수 사용시 결과 관련 질문
0
371
1
exec 관련 궁금한 사항
0
450
2
파일 디스크립터와 FILE 구조체에 대한 질문
0
552
1
buf 선언에 따른 read() fail 문제
0
251
2
파일 이벤트 - 라이브 프로그래밍 에서 캐스팅 질문
0
254
1
2번 multi thread 방법 질문
0
242
1
segmentation fault 발생 관련 문의
1
842
1
라이브 코딩 실습 코드
0
235
1





