谁能提供使用QThreadPool类中的“reserveThread”和/或“releaseThread”的示例吗?我已经阅读了文档,但是我不太了解何时使用这些功能。互联网上的示例搜索空无一物。
我使用的是PySide,因此首选Python,但C++也不错。
最佳答案
这些方法用于使线程池与您手动管理的线程互操作。
线程池保留 Activity 线程的数量,并旨在使其不超过在给定硬件上有意义的最大线程数。 reserveThread
和releaseThread
更改池知道的 Activity 线程数。它不会直接在池中添加或删除任何线程。 这些方法不返回QThread
,这不是错误。 reserveThread
的意思是:“我正在使用在其他地方管理的线程,因此即使不是您的(线程池的)线程,也请考虑我的线程处于 Activity 状态。releaseThread
的意思是:“我不再使用我的线程,可以随时激活更多线程。”
示例:考虑一个四逻辑CPU系统。代码是C++。
QThreadPool pool;
assert(pool.maxThreadCount() == 4);
assert(pool.activeThreadCount() == 0);
reserveThread
通知池:MyWorker worker;
QThread thread;
worker.moveToThread(&thread);
thread.start();
pool.reserveThread();
assert(pool.activeThreadCount() == 1);
池本身未运行任何线程!
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);
现在只有三个可运行对象处于 Activity 状态,这是因为四个线程中的一个已保留并且无法处于 Activity 状态:因为线程在那里忙,所以它没有CPU可以运行。
releaseThread
通知池:thread.quit();
thread.wait();
pool.releaseThread();
QThread::sleep(1);
assert(pool.activeThreadCount() == 4);
assert(act.load() == 4);
由于存在额外的可运行等待,因此激活了线程以使可运行运行。
QThread::sleep(60);
assert(pool.activeThreadCount() == 0);
assert(act.load() == 0);
关于qt - QThreadPool reserveThread示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38959277/