2016-08-15 4 views
4

누구나 QThreadPool 클래스에서 "reserveThread"및/또는 "releaseThread"를 사용하는 예제를 제공 할 수 있습니까? 나는이 문서를 읽었지만, 당신이이 기능들을 언제 사용하는지 정말로 모르겠습니다. 인터넷 검색 사례가 비어 있습니다.QThreadPool reserveThread 예제

저는 PySide를 사용하고 있기 때문에 Python을 선호하지만 C++ 또한 좋습니다.

답변

6

이 메서드는 스레드 풀을 수동으로 관리하는 스레드와 상호 운용하는 데 사용됩니다.

스레드 풀은 활성 스레드 수를 유지하고 해당 스레드가 주어진 하드웨어에서 이해할 수있는 최대 스레드 수를 초과하지 않도록합니다. reserveThreadreleaseThread은 풀이 인식하는 활성 스레드 수를 변경합니다. 풀에서 스레드를 직접 추가하거나 제거하지 않습니다. 이 메소드가 QThread을 리턴하지 않는다는 것은 오류가 아닙니다.

reserveThread 의미 : "나는 당신 아니더라도 (스레드 풀의)

releaseThread 의미 활성화 될 나의 스레드를 고려하시기 바랍니다, 내가 다른 곳에서 관리 스레드를 사용하고 있습니다."나는 아니에요 더 이상 내 스레드를 사용하여, 활성 사용자 스레드의 이상을 주시기 바랍니다 "

예 :. 네 논리적 CPU 시스템을 고려 코드는 C++입니다 처음

  1. :..

    QThreadPool pool; 
    assert(pool.maxThreadCount() == 4); 
    assert(pool.activeThreadCount() == 0); 
    
  2. 전용 계산 스레드를 시작합니다. 하나의 코어가 사용 중입니다. 당신은 reserveThread를 호출하여 풀을 통보 :

    MyWorker worker; 
    QThread thread; 
    worker.moveToThread(&thread); 
    thread.start(); 
    pool.reserveThread(); 
    assert(pool.activeThreadCount() == 1); 
    

    수영장 어떤 스레드 자체가 실행되지 않습니다!

  3. 각 runnables를 제출하는 데 시간이 조금 걸립니다. 수영장은이를 실행하기 위해 세 개의 추가 스레드를 만듭니다

    QAtomicInt act = 0; 
    QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); }); 
    QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); }); 
    QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); }); 
    QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); }); 
    QThread::sleep(1); 
    assert(pool.activeThreadCount() == 4); 
    assert(act.load() == 3); 
    

    단지 3 개보다 Runnable 지금 활성, 1 ~ 4 중 스레드가 예약되어 있기 때문에 활성 수 없습니다 : 그것은에 실행 할 CPU가없는 것, 때문에 스레드가 바쁘다.

  4. 계산 스레드가 완료되고 하나의 코어를 확보하십시오. 당신은 releaseThread를 호출하여 풀을 통보 : 추가 실행 가능한 대기가 있었다 때문에, 쓰레드가 실행 가능한 가야하는 활성화 된

    thread.quit(); 
    thread.wait(); 
    pool.releaseThread(); 
    QThread::sleep(1); 
    assert(pool.activeThreadCount() == 4); 
    assert(act.load() == 4); 
    

    . 잠시 후

  5. 는 모든보다 Runnable이 수행되지 않으며, 더 활성 스레드에는이 있습니다 :

    QThread::sleep(60); 
    assert(pool.activeThreadCount() == 0); 
    assert(act.load() == 0); 
    
+1

아, 내가 지금 볼 수는. 그리고 쓰레드 풀이 이미 4 개의 실행 쓰레드를 가지고 있고 (최대 쓰레드 개수가 4라고 가정 할 때),'reserveThread'를 호출하면,'activeThreadCount'는 최대 쓰레드 카운트보다 높더라도 일시적으로 5까지 올라갑니다. 실행중인 쓰레드 중 하나가 끝나면'activeThreadCount'가 4로 돌아갑니다. 설명해 주셔서 감사합니다. –