任何人都可以提供从QThreadPool类使用"reserveThread"和/或"releaseThread"的示例吗?我已经阅读了文档,但是我真的不明白你什么时候会使用这些函数.互联网搜索示例已经空洞.
我正在使用PySide,因此Python是首选,但C++也很好.
这些方法用于将线程池与您手动管理的线程进行互操作.
线程池保留活动线程的数量,目的是使其不超过在给定硬件上有意义的最大线程数.该reserveThread和releaseThread更改活动的线程数,游泳池是知道的.它不直接添加或删除池中的任何线程.这些方法不返回a并不是错误QThread.
reserveThread 意思是:"我正在使用我在其他地方管理的线程,所以请考虑我的线程是活动的,即使它不是你的(线程池).
releaseThread 意思是:"我不再使用我的线程,随意让更多的线程处于活动状态."
示例:考虑一个四逻辑CPU系统.代码是C++.
原来:
QThreadPool pool;
assert(pool.maxThreadCount() == 4);
assert(pool.activeThreadCount() == 0);
Run Code Online (Sandbox Code Playgroud)您启动一个专用的计算线程:一个核心变得忙碌.您可以致电reserveThread:
MyWorker worker;
QThread thread;
worker.moveToThread(&thread);
thread.start();
pool.reserveThread();
assert(pool.activeThreadCount() == 1);
Run Code Online (Sandbox Code Playgroud)
该池本身没有运行任何线程!
你提交了四个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可以运行,因为你的线程在那里忙.
您的计算线程已完成,您可以释放一个核心.您可以致电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运行.
一分钟后,所有的runnable都完成了,并且没有更多的活动线程:
QThread::sleep(60);
assert(pool.activeThreadCount() == 0);
assert(act.load() == 0);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1307 次 |
| 最近记录: |