Получение потока Core affinity в C++ 11 через pthreads

Я пытаюсь установить соответствие ядра (поток № 1 идет на первом ядре, поток № 2 идет на втором ядре, ...) при использовании std::thread в C++ 11.

Я уже искал разные темы и в интернете, и кажется, что C++ 11 API не предоставляет такую ​​низкоуровневую функцию.

С другой стороны, pthreads поставляется с pthread_setaffinity_np, что было бы полезно, если бы я мог получить значение "pthread_t" моего std::thread (я не знаю, разумно ли это для человека или, по крайней мере, законно просить об этом).

Пример программы, которую я хотел бы получить в конце концов, таков:

#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, как вы видели в примере.

Есть ли способ для меня, чтобы решить эту проблему?

2 ответа

Решение

Вы можете получить родную ручку для потока с native_handle функция.

Пример в связанной ссылке даже использует это для вызова функций pthread.

Я не знаю, является ли это подходящим подходом в вашем случае, но я обычно вызываю примитивы сродства из потока. Например, я помещаю фрагмент кода, подобный этому, где-то в начале многопоточной функции:

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

Призыв к pthread_self() вернет идентификатор вызывающего потока.

Другие вопросы по тегам