如何在 Qt5 中设置线程的 CPU 亲和力?

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

Qt5 中使用线程,如何设置单个线程的 CPU affinity

我想指定一个可用 CPU 核心的掩码,线程可以 运行 在其下。

换句话说,Qt5 等同于 Posix 线程的 pthread_setaffinity_np() 是什么?

我可以为 QThreadPool 管理的线程执行此操作吗?

Qt 不提供任何 public API 用于设置处理器关联。 QThreadPool 绝对没有办法做到这一点,它甚至没有提供 API 来访问池中的 QThread

对于显式创建的 QThread 对象,您可以尝试使用 QThread::getCurrentThreadId() 函数将本机 "handle" return 传递给线程,然后将其传递给您的系统的线程管理库调用。但我强烈建议不要这样做。文档明确指出:

Warning: The handle returned by this function is used for internal purposes and should not be used in any application code.

如果您正在为特定平台构建,您可以混合调用 OS 的库(例如,pthreads),但这将不可移植,我不知道它是否会起作用。

您最好的选择可能是从命令行管理整个应用程序的 CPU 亲和力。如果您在 Linux、taskset is the way to go. For Windows, take a look at this SO answer。不幸的是,Apple 似乎下定决心要阻止用户设置线程亲和性,至少从命令行是这样。

通常这类事情是通过提取本机线程句柄然后执行任何必要的系统特定操作来完成的,因为没有公认的跨平台 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()));
}

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