Я хочу отобразить определенные потоки на определенные процессоры перед выполнением, способом, который мы делаем, передавая pthread_attr_t
в pthread_create
, но с std::thread
объекты. Я пробовал следующее:
std::vector<std::thread> threads;
for (int i = 0; i<num_threads; i++) {
threads.push_back(std::thread(&some_struct::run, some_structs_vector.at(i)));
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(i, &cpuset);
int rc = pthread_setaffinity_np(threads.at(i).native_handle(), sizeof(cpu_set_t), &cpuset);
assert(rc == 0);
}
Хотя этот код выполняет свою работу, он устанавливает сходство в неуказанный момент выполнения потока, что приводит к тому, что процессору, возможно, придется перемещать поток во время выполнения на другой процессор.
Если я устанавливаю сходство как первое, что есть внутри кода потока, передавая ноль
int rc = pthread_setaffinity_np(0, sizeof(cpu_set_t), &cpuset);
я получаю ошибку сегментации. Если я пройду pthread_self()
вместо нуля я получаю EINVAL в качестве возврата.
int rc = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
Но изменение сродства потока после начала выполнения также может привести к его перемещению.
Итак, как я могу установить сходство потоков до начала выполнения с современными объектами std :: thread?
РЕДАКТИРОВАТЬ: Меня не волнует приоритет, просто сопоставление с определенными ядрами.
Задача ещё не решена.
Других решений пока нет …