gpt4 book ai didi

QThreadPool 保留线程示例

转载 作者:行者123 更新时间:2023-12-04 10:25:00 24 4
gpt4 key购买 nike

谁能提供一个使用 QThreadPool 类中的“reserveThread”和/或“releaseThread”的例子?我已阅读文档,但我真的不明白您何时会使用这些功能。互联网搜索示例已空空如也。

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

最佳答案

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

线程池保持事件线程的计数,并使其不超过给定硬件上有意义的最大线程数。 reserveThreadreleaseThread更改池知道的事件线程数。它不会直接从池中添加或删除任何线程。 这些方法不返回 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);

    池本身没有运行任何线程!
  • 您提交了四个 runnable,每个都需要一段时间。池创建了三个额外的线程来执行它们:
    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);

    现在只有三个 runnable 处于事件状态,因为四分之一的线程被保留并且不能处于事件状态:它没有 CPU 可以运行,因为您的线程在那里很忙。
  • 您的计算线程已完成,您释放了一个核心。您通过调用 releaseThread 通知游泳池:
    thread.quit();
    thread.wait();
    pool.releaseThread();
    QThread::sleep(1);
    assert(pool.activeThreadCount() == 4);
    assert(act.load() == 4);

    由于有一个额外的可运行等待,一个线程被激活以使可运行运行。
  • 一分钟后,所有的 runnable 都完成了,并且没有更多的事件线程:
    QThread::sleep(60);
    assert(pool.activeThreadCount() == 0);
    assert(act.load() == 0);
  • 关于QThreadPool 保留线程示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38959277/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com