2010-04-12 2 views

답변

54

은 보자 :

>>> x = 1 
>>> y = 2 
>>> def swap_xy(): 
... global x, y 
... (x, y) = (y, x) 
... 
>>> dis.dis(swap_xy) 
    3   0 LOAD_GLOBAL    0 (y) 
       3 LOAD_GLOBAL    1 (x) 
       6 ROT_TWO    
       7 STORE_GLOBAL    1 (x) 
      10 STORE_GLOBAL    0 (y) 
      13 LOAD_CONST    0 (None) 
      16 RETURN_VALUE  

그들이 원자 걸 나타나지 않습니다 : x와 y의 값 사이에 다른 스레드에 의해 변경 될 수 있습니다 LOAD_GLOBAL 바이트 코드, ROT_TWO 전후, 및 STORE_GLOBAL 바이트 코드 사이에 존재한다.

두 변수를 원자 적으로 교환하려면 잠금 또는 뮤텍스가 필요합니다. 그 희망하는 경험적 증거를 들어

:

>>> def swap_xy_repeatedly(): 
... while 1: 
...  swap_xy() 
...  if x == y: 
...  # If all swaps are atomic, there will never be a time when x == y. 
...  # (of course, this depends on "if x == y" being atomic, which it isn't; 
...  # but if "if x == y" isn't atomic, what hope have we for the more complex 
...  # "x, y = y, x"?) 
...  print 'non-atomic swap detected' 
...  break 
... 
>>> t1 = threading.Thread(target=swap_xy_repeatedly) 
>>> t2 = threading.Thread(target=swap_xy_repeatedly) 
>>> t1.start() 
>>> t2.start() 
>>> non-atomic swap detected 
4

예, 가능합니다.

I stand corrected.

크레 이건 Sitaker 글 :

누군가가 스레드 안전 스왑을 얻을 수있는 관용구

spam, eggs = eggs, spam 

를 사용하는 것이 좋습니다. 이게 정말 효과가 있니? (...)
따라서이 스레드가 첫 번째 LOAD_FAST
과 마지막 STORE_FAST 사이의 위치에서 제어를 잃는 경우 다른 스레드
에 의해 값이 저장되어 손실 될 수 있습니다. 이걸 지키고있는 게 없어.
그런가?

아니요. 일반적으로 단순한 할당은 스레드 안전성이 필요합니다. 할당을 수행하면 객체의 특수 메소드를 호출 할 수 있습니다.이 메소드는 숫자 의 조작이 필요할 수 있습니다. 개체 은 "상태"값을 내부적으로 잠 갔기 때문에이 항상 그런 것은 아닙니다. 그것에 대해 "스레드 안전"을 이야기하기 어렵다 있도록

하지만 정말 때문에이 내 마음에, "스레드 안전"특정 응용 프로그램에서 무엇을 의미하는지에 의해 결정이야는 안전 단위의 많은 수준이다. 유일한 것에 관해서는 파이썬 인터프리터는 에 무료로 제공됩니다. 내장 된 데이터 유형은 내장 스레딩을 사용하는 경우에도 내부에서 안전해야합니다. 즉 이 경우 스레드가 a=0xffa=0xff00을, A는 가 보호되지 않는 경우 다른 언어에서 가능한 수 있습니다 하나 또는 다른,하지만 실수 0xffff와 을 종료합니다. 말했다와

파이썬은 또한 가장자리에 조금 살고 이 에 기꺼이하는 경우 , 공식 잠금없이 멀리 엄청 많이 얻을 수있는 그런 방식으로 실행 경향 실제 개체에 대한 암시 적 종속성. 여기에 해당 라인을 따라 예의 토론이있었습니다. c.l.p a while back - others 중 " 섹션 및 뮤텍스"중요 스레드에 대해 groups.google.com을 검색하십시오. 개인적으로

, 내가 명시 적으로 멀티 스레드 응용 프로그램에서 상태 (예 : Queue.Queue 같은 교환 정보 공유 스레드 사이에 제대로 을 위해 설계 또는 사용 구조를) 공유 잠금. 내 마음에 그것은 최고의 보호 유지 보수 및 진화에 대해 도로.

- - David

+1

이유는 무엇입니까? 길? 해체는 원 자성을 제안하지 않습니다 (@ jemfinch의 대답 참조). – kennytm

+0

(BTW, 위의 설명은 수사적 질문이 아닙니다.) – kennytm

+0

@Kenny : 저수준에서 튜플 압축 풀기가 어떻게 작동했는지에 대한 오해였습니다. – voyager

관련 문제