程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误?

开发过程中遇到在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误的问题如何解决?下面主要结合日常开发的经验,给出你关于在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误的解决方法建议,希望对你解决在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误有所启发或帮助;

我有一个多线程项目。我想将 cpu 关联性设置为特定线程。我正在 windows 上工作并使用 MinGW 编译器。但是当我初始化类型 cpu_set_t 时,出现错误“类型 cpu_set_t 未在此范围内声明”。我不明白原因。我期待你的帮助!谢谢!

#define _GNU_sourcE
#include <iostream>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
int main() 
{
   int core_ID = 1;
   cpu_set_t cpuset; // error here
   cpu_ZERO(&cpuset);
   cpu_SET(core_ID,&cpuset);
   pthread_t current_thread = pthread_self();    
   pthread_setaffinity_np(current_thread,sizeof(cpu_set_t),&cpuset);
}

解决方法

Windows 本身不支持 pthreads 标准。 MinGW 项目使用 winpthreads 库作为原生 Windows 线程的包装器。

'_np' 后缀 - 表示不可移植。 pthreads(posiX) 标准确实需要这些 *_np 函数。

当前版本的 winpthreads 没有很多在 Linux 等其他操作系统上可以看到的 *_np 函数。

您可以编写自己的函数来更改 Windows 线程关联并从您的线程调用它。 类似的东西:

#include <windows.h>

// Bind thread to CPUs
// Return previous mask value on success,0 on failure
DWORD_PTR BindThreadToCPU(
                            DWORD mask // 1  -  bind to cpu 0
                                       // 4  -  bind to cpu 2
                                       // 15 -  bind to cpu 0,1,2,3
                          )
{
    HANDLE th = GetCurrentThread();
    DWORD_PTR prev_mask = SetThreadAffinitymask(th,mask);
    return prev_mask;
}

注意:线程关联掩码必须是进程关联掩码的子集。

还有来自 Microsoft documentation 的关于 SetThreadAffinitymask() 及其调度程序的有趣引用:

线程关联强制线程在特定的处理器子集上运行。 通常应该避免设置线程关联,因为它会干扰 调度程序具有跨处理器有效调度线程的能力。 这会降低并行处理产生的性能提升。 线程亲和性的适当使用是测试每个处理器。

在现代版本的 Windows 中,SetThreadIdealProcessor() 函数对调度程序更友好,并允许您为线程设置首选 CPU(但没有任何严格的亲和性保证)。

大佬总结

以上是大佬教程为你收集整理的在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误全部内容,希望文章能够帮你解决在 Windows pthread_setaffinity_np 上设置 CPU 关联性错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。