如何在 Qt5 中设置线程的 CPU 关联?
How can I set a thread's CPU affinity in Qt5?
使用 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似乎非常决心防止用户设置线程亲和力,至少是在命令行中。
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 关联容器的下界复杂性:成员函数与非成员函数
- std::future_error:无关联状态
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- 查找自动生成键并具有线性内存消耗的小型关联数组
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何在 OpenCV 中将图像与另一个图像相关联
- 删除提升存档对象也会删除与其关联的流?
- 变量如何以及在何处可能没有C++关联的名称?
- 将正态随机变量与任意 RHO(corrcoef) 相关联
- 分别测量每个线程上花费的 CPU 时间(C++)
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 试图(稍微)概括C++模板.关联容器键:值反转
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 如何在 Qt5 中设置线程的 CPU 关联?
- 通过克隆创建的子项是否会继承其父级的 CPU 关联掩码?
- 为什么设置 CPU 关联会使线程运行速度变慢