• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

Thread(4) - Lock, Deadlock 강의를 듣다가 질문드립니다.

21.10.02 19:54 작성 조회수 113

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요. Thread(4) - Lock, Deadlock 강의를 듣다가 궁금한 점이 생겨서요.
파이썬은 GIL로 한번에 한 스레드만 실행되도록 하고, 제가 멀티스레드를 생성해도 결국 한 스레드만 실행되게 한다고 배웠습니다.
그런데 보여주신 아래 예제에서는 값이 제대로 반영안되는 걸 보여주셨는데요..
 
local_copy = self.value local_copy += 1 time.sleep(0.1) self.value = local_copy
 
어차피 GIL때문에 락이 잠겨서 한번에 한 스레드밖에 실행되지 않는데, 이게 값이 왜 제대로 반영안되는건지 궁금합니다.
여러 스레드들은 내부적으로 큐로 관리되고, 한 스레드가 제대로 끝나기 전에는 다른 스레드는 실행되지 않을테니 저 부분이 실행되고 나서야 다른 스레드가 접근할텐데요..
GIL자체가 공유자원에 대한 thread safe하지 않기때문에 그걸 보장하기 위해 인터프리터를 잠가버리는거라고 이해했는데 제 이해가 틀린걸까요 ㅠ GIL이 reference count를 thread safe하게 유지시키기 위해 필요하다고 알고있는데, GIL이 있음으로써 보호해주는건 reference count 하나뿐일까요? GIL이 있음에도 불구하고 멀티스레딩을 thread safe하게 구현할 때는 개발자가 lock을 매번 걸어줘야하는걸까요?

답변 2

·

답변을 작성해보세요.

0

chang-seok You님의 프로필

chang-seok You

2021.11.04

GIL은 한번에 실행중인 스레드가 1개임을 보장하는 것으로 알고있어요. 한 스레드가 온전히 동작한다는 것은 컴퓨터가 이해하기엔 힘든 개념인것 같아요.

특히 time.sleep(0,1)을 하는 순간 다른 스레드가 실행되도록 실행이 멈출테니 데이터를 보장하기 더 어려워지는것 같아요.

sleep에 대한 자료 링크입니다.(파이썬은 아닙니다) https://kldp.org/node/125415

0

열심히 하시네요!

아니요~ 내부적으로 CPYTHON (파이썬 언어를 만든 구현 원리)에서 자동으로 

말씀하신대로 실행되도록 구현되어 있습니다.