如何在 Qt5 中设置线程的 CPU 关联?

How can I set a thread's CPU affinity in Qt5?

本文关键字:CPU 关联 线程 设置 Qt5      更新时间:2023-10-16

使用 qt5 中的线程,如何设置单个线程的CPU亲和力?

我想指定线程可能在下面运行的可用CPU内核的掩码。

换句话说,QT5等于POSIX线程的pthread_setaffinity_np()是什么?

我可以为QThreadPool管理的线程吗?

通常是通过提取本机线句柄然后执行特定系统必要的任何事情来完成的事情,因为不存在用于低级线程管理的接受的跨平台API。

的确,如果我们检查qthread_unix.cpp的来源,我们将看到以下内容:

Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
{
    // requires a C cast here otherwise we run into trouble on AIX
    return to_HANDLE(pthread_self());
}

qthread_win.cpp中的实现将以预期的方式不同:

Qt::HANDLE QThread::currentThreadId() Q_DECL_NOTHROW
{
    return reinterpret_cast<Qt::HANDLE>(quintptr(GetCurrentThreadId()));
}

因此,应用程序代码有责任执行与预期运行的每个平台有关的适当的低级操作。

qt不提供任何用于设置处理器亲和力的公共API。对于QThreadPool,肯定没有办法这样做,它甚至没有提供用于访问池中QThread S的API。

对于明确创建的QThread对象,您可以尝试使用QThread::getCurrentThreadId()函数将本机"句柄"返回到线程中,然后将其传递给系统的线程管理库呼叫。但是我强烈建议反对这一点。文档明确表示:

警告:此功能返回的句柄用于内部目的,不应在任何应用程序代码中使用。

如果您是为特定平台构建的,则可以混合使用操作系统库的呼叫(例如pthreads),但这将无法便携,我不知道它是否可以工作。

您最好的选择可能是从命令行管理整个应用程序的CPU亲和力。如果您在Linux上,则taskset是必经之路。对于Windows,请查看此答案。不幸的是,Apple似乎非常决心防止用户设置线程亲和力,至少是在命令行中。