2016-08-15 6 views
4

Может ли кто-нибудь предоставить пример использования «reserveThread» и/или «releaseThread» из класса QThreadPool? Я прочитал документацию, но я не понимаю, когда вы будете использовать эти функции. Поисковые запросы в Интернете выглядят пустыми.QThreadPool reserveThread пример

Я использую PySide, поэтому Python будет предпочтительнее, но C++ тоже хорош.

ответ

6

Эти методы используются для взаимодействия пула потоков с потоками, которые вы вручную управляете.

Пул потоков содержит подсчет активных потоков и нацелен на то, чтобы он не превышал максимальное количество потоков, которые имеют смысл на данном оборудовании. reserveThread и releaseThread изменяют количество активных потоков, о которых знает пул. Он не добавляет и не удаляет нити из пула. Это не ошибка, что эти методы не возвращают QThread.

reserveThread означает: «Я использую нить, что я управляю в другом месте, поэтому, пожалуйста, рассмотреть мою нить, чтобы быть активным, даже если это не ваш (пул потоков в)

releaseThread означает:.» Я не используя мою нить больше, не стесняйтесь, чтобы сделать больше ваших активных потоков»

. Пример: Рассмотрим четыре логическую систему CPU код является C++

  1. Первоначально:..

    QThreadPool pool; 
    assert(pool.maxThreadCount() == 4); 
    assert(pool.activeThreadCount() == 0); 
    
  2. Вы запускаете посвященный поток вычислений: одно ядро ​​становится занятым. Вы сообщаете бассейн, позвонив reserveThread:

    MyWorker worker; 
    QThread thread; 
    worker.moveToThread(&thread); 
    thread.start(); 
    pool.reserveThread(); 
    assert(pool.activeThreadCount() == 1); 
    

    бассейн не работает либо сам темы!

  3. Вы отправляете четыре пуска, каждый из которых занимает некоторое время. Пул создает три дополнительных потоков для их выполнения:

    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 теперь активны, так как один из четырех нитей зарезервирован и не может быть активным: он бы без процессора, чтобы работать на, так ваша нить занята.

  4. Ваш расчет потока выполнен, и вы освобождаете одно ядро. Вы сообщаете бассейн, позвонив releaseThread:

    thread.quit(); 
    thread.wait(); 
    pool.releaseThread(); 
    QThread::sleep(1); 
    assert(pool.activeThreadCount() == 4); 
    assert(act.load() == 4); 
    

    Поскольку было дополнительным работоспособным ожиданием, поток был активирован, чтобы получить работоспособные происходят.

  5. Через минуту все runnables не сделано, и больше нет активных потоков:

    QThread::sleep(60); 
    assert(pool.activeThreadCount() == 0); 
    assert(act.load() == 0); 
    
+1

О, теперь я вижу. И если в вашем пуле потоков уже есть 4 работающих потока (при условии, что максимальное количество потоков равно 4), и вы вызываете 'reserveThread', тогда' activeThreadCount' будет временно увеличиваться до 5, даже если это больше, чем максимальное количество потоков. Когда один из работающих потоков заканчивается, 'activeThreadCount' вернется к 4. Спасибо, что объяснили это. –

 Смежные вопросы

  • Нет связанных вопросов^_^