Я пытаюсь установить соответствие ядра (поток № 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, как вы видели в примере.
Есть ли способ для меня, чтобы решить эту проблему?
Вы можете получить родную ручку для потока с native_handle
функция.
Пример в связанной ссылке даже использует это для вызова функций pthread.
Я не знаю, является ли это подходящим подходом в вашем случае, но я обычно вызываю примитивы сродства из потока. Например, я помещаю фрагмент кода, подобный этому, где-то в начале многопоточной функции:
const int err = pthread_setaffinity_np(pthread_self(),...);
Призыв к pthread_self()
вернет идентификатор вызывающего потока.