2016-08-15 198 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); 
    

    只有三个可运行现积极,因为四分之一的线程被保留,并且不能被激活:它会没有CPU上运行,因为你的线程在那里忙碌。

  4. 你的计算线程完成了,你释放了一个核心。您可以通过调用releaseThread告知池:

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

    因为有一个额外的可运行的等待,一个线程被激活,以获得可运行下去。

  5. 一分钟后,所有的可运行完成,而没有更多的活动的线程:

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

哦,我现在看到。如果你的线程池已经有4个正在运行的线程(假设最大线程数为4),并且你调用'reserveThread',那么'activeThreadCount'将暂时增加到5,即使它高于最大线程数。当其中一个正在运行的线程结束时,'activeThreadCount'将回落到4.感谢您解释它。 –