8

我正在尝试在 C++ 11 中使用 std::thread 时设置核心亲和性(线程 #1 在第一个核心上,线程 #2 在第二个核心上,...)。

我已经在各种主题和互联网上进行了搜索,似乎 C++ 11 API 没有提供如此低级的功能。

另一方面,pthread 带有pthread_setaffinity_np,如果我可以获得 std::thread 的“pthread_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;
}

我真的不想改变我项目的整个架构(它必须提供这样的特性)。我现在大量使用 std::thread 但我也可以使用 pthread API,正如您在示例中看到的那样。

我有办法解决这个问题吗?

4

2 回答 2

10

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

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

于 2013-04-16T10:23:51.873 回答
7

我不知道这是否适合您的情况,但我通常做的是从线程内调用亲和原语。例如,我在线程函数开头的某处放置了一段与此类似的代码:

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

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

于 2013-04-16T13:00:58.563 回答