在C+中获取线程核心关联+;11到pthreads 我试图在使用STD::线程在C++ 11中时设置核心亲和力(线程1继续第一核,线程2继续第二核,…)。 我已经搜索过各种各样的话题,在互联网上,似乎C++ 11 API没有提供这样的低级特征。

在C+中获取线程核心关联+;11到pthreads 我试图在使用STD::线程在C++ 11中时设置核心亲和力(线程1继续第一核,线程2继续第二核,…)。 我已经搜索过各种各样的话题,在互联网上,似乎C++ 11 API没有提供这样的低级特征。,c++,c++11,pthreads,multicore,affinity,C++,C++11,Pthreads,Multicore,Affinity,另一方面,pthreads附带了pthread\u setaffinity\u np,如果我能获得std::thread的“pthread\u t”值,这将非常有用(我不知道这是否是人类合理的要求,或者至少是合理的要求) 我最后想要的一个示例程序是: #include <thread> #include <pthread.h> #include <iostream> #include <stdio.h> #include <stdlib.h&

另一方面,pthreads附带了pthread\u setaffinity\u np,如果我能获得std::thread的“pthread\u t”值,这将非常有用(我不知道这是否是人类合理的要求,或者至少是合理的要求)

我最后想要的一个示例程序是:

#include <thread>
#include <pthread.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define CORE_NO 8

using namespace std;

void run(int id) {
    cout << "Hi! I'm thread " << id << endl;
    // thread function goes here
}

int main() {
    cpu_set_t cpu_set;

    CPU_ZERO(&cpu_set);
    for(int i=0; i<CORE_NO; i++)
        CPU_SET(i, &cpu_set);

    thread t1(run, 1);

    // obtaining pthread_t from t1

    /*
    pthread_t this_tid = foo(t1);
    pthread_setaffinity_np(this_tid, sizeof(cpu_set_t), &cpu_set);
    */

    t1.join();

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义核心单元8
使用名称空间std;
无效运行(内部id){

cout您可以使用函数获取线程的本机句柄


链接引用中的示例甚至使用它来调用pthread函数。

我不知道这是否适合您的情况,但我通常做的是从线程内调用关联原语。例如,我将类似于此的代码片段放在线程函数开头的某个地方:

const int err = pthread_setaffinity_np(pthread_self(),...);

pthread_self()的调用
将返回调用线程的ID。

“哪些必须提供这样的特性”-设置线程关联后,您看到了什么性能改进?您有什么数字吗?@Martin James-seconded.Rob013-根据我的经验,在处理核心关联b之前,您必须有一组非常特殊的情况吃操作系统将自动做的东西。然后你必须有一堆代码在运行时计算出程序运行在任何硬件上的线程的最佳关联性,这是一堆麻烦。你可能最好让操作系统从一开始就尽最大努力。如果你真的需要核心关联性,那么你可能会o需要内存亲和力才能获得任何好处,这将彻底破坏您的体系结构。谢谢您的建议。我明白您的观点,我非常确信OS线程管理将比几天前才了解什么是核心亲和力的学生更好。顺便说一句,我的问题是关于移植项目中的一个特定问题所以我只被告知“我们使用核心亲和力,你来实现它”对于我的目标来说,Joachim的解决方案已经足够了。是的,但据我所知,这并不一定是pthread_t类型。pthread本身通常是底层操作系统本机线程之上的一层。带有NPTL的Linux可能是个例外。因此,您需要操作系统特定的例程来处理核心关联。