谁能提供使用QThreadPool类中的“reserveThread”和/或“releaseThread”的示例吗?我已经阅读了文档,但是我不太了解何时使用这些功能。互联网上的示例搜索空无一物。

我使用的是PySide,因此首选Python,但C++也不错。

最佳答案

这些方法用于使线程池与您手动管理的线程互操作。

线程池保留 Activity 线程的数量,并旨在使其不超过在给定硬件上有意义的最大线程数。 reserveThreadreleaseThread更改池知道的 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);
    

    由于存在额外的可运行等待,因此激活了线程以使可运行运行。
  • 一分钟后,所有可运行对象均已完成,并且不再有 Activity 线程:
    QThread::sleep(60);
    assert(pool.activeThreadCount() == 0);
    assert(act.load() == 0);
    
  • 关于qt - QThreadPool reserveThread示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38959277/

    10-11 22:41