任何人都可以提供使用QThreadPool类中的“reserveThread”和/或“releaseThread”的示例吗?我已经阅读过文档,但是我不明白什么时候可以使用这些功能。互联网搜索的例子已经空了。QThreadPool reserveThread示例
我使用的是PySide,所以Python是首选,但C++也不错。
任何人都可以提供使用QThreadPool类中的“reserveThread”和/或“releaseThread”的示例吗?我已经阅读过文档,但是我不明白什么时候可以使用这些功能。互联网搜索的例子已经空了。QThreadPool reserveThread示例
我使用的是PySide,所以Python是首选,但C++也不错。
这些方法用于将线程池与手动管理的线程互操作。
线程池保持活动线程的计数,并且它的目标是不超过在给定硬件上有意义的最大线程数。 reserveThread
和releaseThread
更改池知道的活动线程数。它不直接添加也不从池中删除任何线程。 这些方法不返回QThread
这不是错误。
reserveThread
意思是:“我用我所管理的其他地方一个线程,那么请考虑我的线程是活跃的,即使它不是你(线程池的)
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);
池本身没有运行任何线程!
您提交了四个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上运行,因为你的线程在那里忙碌。
你的计算线程完成了,你释放了一个核心。您可以通过调用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);
哦,我现在看到。如果你的线程池已经有4个正在运行的线程(假设最大线程数为4),并且你调用'reserveThread',那么'activeThreadCount'将暂时增加到5,即使它高于最大线程数。当其中一个正在运行的线程结束时,'activeThreadCount'将回落到4.感谢您解释它。 –