2013-01-11 1 views
2

현재 3 개의 스레드가 있으며 동시에 실행 중입니다.스레드에서 교착 상태 시뮬레이션

def f1(): 
    print "running first thread\n" 
    sleep(10) 

def f2(): 
    print "running second thread\n" 
    sleep(10) 

def f3(): 
    print "running third thread\n" 
    sleep(10) 


if __name__ == "__main__": 
    thread1 = Thread(target = f1) 
    thread2 = Thread(target = f2) 
    thread3 = Thread(target = f3) 

    try: 
     thread1 = Thread(target = f1) 
     thread1.start() 

     thread2 = Thread(target = f2) 
     thread2.start() 

     thread3 = Thread(target = f3) 
     thread3.start() 

     while(thread1.isAlive() or thread2.isAlive() or thread3.isAlive()): 
      thread1.join() 
      thread2.join() 
      thread3.join() 
    except (KeyboardInterrupt, SystemExit): 
     sys.exit() 

교착 상태를 어떻게 시뮬레이트 할 수 있습니까? 또한 각 스레드가 다른 스레드를 실행하게하려면 어떻게해야합니까? 또한 현재 스크립트에서 실행중인 모든 스레드를 나열 할 수 있습니까? 또는 우선 순위를 부여 하시겠습니까?

+0

교착 상태를 시뮬레이트하려고합니까 (제목이 묻는 것처럼) 또는 실제로 교착 상태를 만들려고합니까? 그리고 후자의 경우 실제 상황에서 결코 발생하지 않는 교착 상태의 사소한 인공 케이스 또는 다소 현실적인 시나리오의 가장 간단한 예를 원하십니까? – abarnert

+0

우선, 교착 상태가 발생할 수있는 잠금 장치가 필요할 수 있습니다. http://effbot.org/zone/thread-synchronization.htm – paulsm4

+0

@abarnert; 실제로 교착 상태를 시뮬레이트해야합니다. 미안하지만 내 글을 편집하십시오. – moenad

답변

2

교착 상태를 어떻게 시뮬레이트 할 수 있습니까?

모든 교착 상태는 하나 이상의 스레드가 진행을 방해 받음을 의미하므로 단일 스레드로 시뮬레이션 할 수 있습니다. sleep(10) 주위에 while True:을 넣으십시오.

현실적인 경우 대개 두 스레드가 진행 상황을 동시에 차단합니다. 예를 들어, 한 쌍의 잠금을 반대 순서로 사용했기 때문에 스레드 1은 잠금 2를 얻을 때까지 잠금 1을 해제하지 않지만 스레드 2는 잠금 1을 얻을 때까지 잠금 2를 해제하지 않습니다. 두 개의 스레드가 영구적으로 블록되어서 시뮬레이션하는 것이 더 좋습니다. f2f1-thread2.join()thread1.join()을 추가

실제로 교착 상태를 만들려면

는 가장 간단한 방법은 스레드가 문자 그대로 서로를 차단하는 것입니다. 그렇다면 f1f2까지 완료 할 수 없습니다. 은 f1까지 완료 할 수 없으므로 어느 쪽도 완료 할 수 없습니다.

그러나 사실적인 교착 상태를 만들려면 threading.Lock과 같은 동기화 개체를 사용하여 위에서 설명한 2- 잠금 시나리오를 수행해야합니다.

또한 어떻게하면 다른 스레드를 실행할 수 있습니까?

글쎄, 쉬운 방법은 처음에는 스레드를 사용하지 않는 것입니다. 당신이 정말로 원하는 경우에, 다만이 작업을 수행 :

thread1.start() 
thread1.join() 
thread2.start() 
thread2.join() 
thread3.start() 
thread3.join() 

또한 나는 현재 내 스크립트에서 실행중인 모든 스레드를 나열 할 수 있습니다?

threading.enumerate()을 참조하십시오. 일반적으로 디버깅 목적을 제외하고는 이것을 사용하지 않으려 고합니다. 나중에 스레드에 대한 액세스 권한을 원할 경우 스레드를 생성 할 때 스레드를 추적하십시오.

또는 우선 순위를 부여 하시겠습니까?

현재 어떤 우선 순위, 아니 스레드 그룹이없고, 스레드, 중단, 중지, 파괴 재개 또는 중단 할 수 없습니다

는 워드 프로세서 말하는 것처럼. 당신이 원하는 경우

, 당신은 threading의 외부 단계가 있고, 예를 들어, ctypes, win32api 등을 통해 네이티브 API를 사용

0

코드를 작성하기 전에 deadlock의 모양을 검토해야합니다. 이 상황은 응용 프로그램에서 피할 수있는 일부 examples을 보려고하면 바람직하지 않습니다.