QThreadPool reserveThread示例

Bec*_*des 4 qt pyside

任何人都可以提供从QThreadPool类使用"reserveThread"和/或"releaseThread"的示例吗?我已经阅读了文档,但是我真的不明白你什么时候会使用这些函数.互联网搜索示例已经空洞.

我正在使用PySide,因此Python是首选,但C++也很好.

Rei*_*ica 7

这些方法用于将线程池与您手动管理的线程进行互操作.

线程池保留活动线程的数量,目的是使其不超过在给定硬件上有意义的最大线程数.该reserveThreadreleaseThread更改活动的线程数,游泳池是知道的.它不直接添加或删除池中的任何线程.这些方法不返回a并不是错误QThread.

reserveThread 意思是:"我正在使用我在其他地方管理的线程,所以请考虑我的线程是活动的,即使它不是你的(线程池).

releaseThread 意思是:"我不再使用我的线程,随意让更多的线程处于活动状态."

示例:考虑一个四逻辑CPU系统.代码是C++.

  1. 原来:

    QThreadPool pool;
    assert(pool.maxThreadCount() == 4);
    assert(pool.activeThreadCount() == 0);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您启动一个专用的计算线程:一个核心变得忙碌.您可以致电reserveThread:

    MyWorker worker;
    QThread thread;
    worker.moveToThread(&thread);
    thread.start();
    pool.reserveThread();
    assert(pool.activeThreadCount() == 1);
    
    Run Code Online (Sandbox Code Playgroud)

    该池本身没有运行任何线程!

  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);
    
    Run Code Online (Sandbox Code Playgroud)

    现在只有三个runnables处于活动状态,因为四个线程中有一个是保留的并且不能处于活动状态:它没有CPU可以运行,因为你的线程在那里忙.

  4. 您的计算线程已完成,您可以释放一个核心.您可以致电releaseThread:

    thread.quit();
    thread.wait();
    pool.releaseThread();
    QThread::sleep(1);
    assert(pool.activeThreadCount() == 4);
    assert(act.load() == 4);
    
    Run Code Online (Sandbox Code Playgroud)

    由于有一个额外的可运行等待,一个线程被激活以使runnable运行.

  5. 一分钟后,所有的runnable都完成了,并且没有更多的活动线程:

    QThread::sleep(60);
    assert(pool.activeThreadCount() == 0);
    assert(act.load() == 0);
    
    Run Code Online (Sandbox Code Playgroud)