Установить сходство в std :: thread перед выполнением

Я хочу отобразить определенные потоки на определенные процессоры перед выполнением, способом, который мы делаем, передавая 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?

РЕДАКТИРОВАТЬ: Меня не волнует приоритет, просто сопоставление с определенными ядрами.

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …