2009-04-17 5 views
2
import time 
import threading 

class test(threading.Thread): 
    def __init__ (self): 
     threading.Thread.__init__(self) 
     self.doSkip = False 
     self.count = 0 

    def run(self): 
     while self.count<9: 
     self.work() 

    def skip(self): 
     self.doSkip = True 

    def work(self): 
     self.count+=1 
     time.sleep(1) 
     if(self.doSkip): 
     print "skipped" 
     self.doSkip = False 
     return 
     print self.count 

t = test() 
t.start() 
while t.count<9: 
    time.sleep(2) 
    t.skip() 

답변

2

스레드 안전 방식? 여기서 보호하고 싶은 부분이 보이지 않습니다.

건너 뛰기로 인해 언제든지 doSkip을 재설정 할 수 있으므로 잠금 기능이별로 없습니다. 동시에 액세스 할 수있는 리소스가 없습니다. 따라서이 코드에서는 아무 것도 손상되거나 안전하지 않을 수 있습니다.

잠금/카운팅에 따라 다르게 실행되는 유일한 부분은 .skip()을 호출 할 때마다 얼마나 많은 "건너 뛰기"가 예상되는지입니다. 모든 건너 뛰기가 건너 뛴 전화 인 .work()이되도록하려면 doSkip을 증분 및 비교/감소 모두에 대한 잠금으로 보호되는 카운터로 변경해야합니다. 현재 한 스레드는 확인 후 doSkip 재설정 전에 doSkip을 켤 수 있습니다. 이 예제에서는 중요하지 않지만 실제 상황에서는 더 많은 코드를 사용하여 차이가 발생할 수 있습니다.

0

분명히 중요한 리소스가 없으므로 스레드로부터 안전하다고 할 수 있습니다.

하지만 평소와 같이 두 스레드가 스케줄러에 의해 차단/실행되는 순서를 예측할 수 없습니다.

0

이것은 스레드간에 데이터를 공유하지 않는 한 스레드로부터 안전합니다.

다른 스레드가 스레드 클래스에 데이터를 읽고 쓰는 데 필요한 경우 잠금과 같은 동기화 메커니즘으로 데이터를 보호하지 않으면 스레드로부터 안전하지 않습니다.

1

뮤텍스 부울 테스트 (예 : if (self.doSkip))가 뮤텍스 부울 집합과 별개가 될 때마다 스레드 문제가 발생할 수 있습니다.

규칙은 스레드가 가장 불편한 시간에 스왑 아웃된다는 규칙입니다. 즉, 테스트를 거친 후 세트 전입니다. 서로 가깝게 이동 시키면 스크류 업 창이 줄어들지 만 제거되지는 않습니다. 거의 항상 그 창을 완전히 닫으려면 언어 또는 커널에서 특수하게 생성 된 메커니즘이 필요합니다.

스레드 라이브러리에는 스레드 동기화 및/또는 코드의 중요한 부분을 만드는 데 사용할 수있는 세마포가 있습니다. DanM의 대답에 정교하게

0

는 생각할이 일어날 수 :

  1. 스레드 1 : t.skip()
  2. 스레드 2 : if self.doSkip: print 'skipped'
  3. 스레드 1 : t.skip()
  4. 스레드 2 : self.doSkip = False
  5. 등 .

즉, t.skip()에 대한 모든 호출에 대해 하나씩 "건너 뛴다"고 예상 할 수 있지만,이 일련의 이벤트는이를 위반합니다.

그러나 sleep() 호출 때문에이 일련의 이벤트는 실제로 불가능하다고 생각합니다.

(컴퓨터하지 않는 한 정말 천천히을 를 실행)
관련 문제