Эти методы используются для взаимодействия пула потоков с потоками, которые вы вручную управляете.
Пул потоков содержит подсчет активных потоков и нацелен на то, чтобы он не превышал максимальное количество потоков, которые имеют смысл на данном оборудовании. 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);
бассейн не работает либо сам темы!
Вы отправляете четыре пуска, каждый из которых занимает некоторое время. Пул создает три дополнительных потоков для их выполнения:
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);
только три runnables теперь активны, так как один из четырех нитей зарезервирован и не может быть активным: он бы без процессора, чтобы работать на, так ваша нить занята.
Ваш расчет потока выполнен, и вы освобождаете одно ядро. Вы сообщаете бассейн, позвонив releaseThread
:
thread.quit();
thread.wait();
pool.releaseThread();
QThread::sleep(1);
assert(pool.activeThreadCount() == 4);
assert(act.load() == 4);
Поскольку было дополнительным работоспособным ожиданием, поток был активирован, чтобы получить работоспособные происходят.
Через минуту все runnables не сделано, и больше нет активных потоков:
QThread::sleep(60);
assert(pool.activeThreadCount() == 0);
assert(act.load() == 0);
О, теперь я вижу. И если в вашем пуле потоков уже есть 4 работающих потока (при условии, что максимальное количество потоков равно 4), и вы вызываете 'reserveThread', тогда' activeThreadCount' будет временно увеличиваться до 5, даже если это больше, чем максимальное количество потоков. Когда один из работающих потоков заканчивается, 'activeThreadCount' вернется к 4. Спасибо, что объяснили это. –