Я использую многопоточность C ++ 11 и мне нужно установить привязку потока к определенному ядру процессора (планировщик windows не передает ядро интеллектуально, и я хочу контролировать, какой поток идет к какому ядру).
Для окон есть
SetThreadAffinityMask(GetCurrentThread(), affinity);
Как будет выглядеть одна кроссплатформенная функция, которая будет работать в Windows, Linux и OSX со всеми изменениями базовых библиотек потоков (потоков Windows, pthreads и т. Д.)?
Если часть C ++, я подозреваю, что это смотреть что-то вроде пары функций-членов:
std::error_code std::thread::hardware_affinity(const std::vector<bool>&);
и свободная функция:
std::error_code std::this_thread::hardware_affinity(const std::vector<bool>&);
при условии, что мы говорим о примерно тех же ресурсах, std::thread::hardware_concurrency()
рассчитывает, и это std::thread
Реализации должны уже заботиться о «всех перестановках базовых библиотек потоков».
Собирая его самостоятельно или используя служебную библиотеку (я не могу назвать существующую сейчас), она, вероятно, будет выглядеть так:
thread_utils::hardware_affinity(std::thread::native_handle_type, const std::vector<bool>&)
но он должен был бы поддерживать все перестановки внутри. Это не очень сложно (многие приложения все равно делают это по необходимости), но это больше работы, чем может выдержать ответ переполнения стека. ^ _ ^
Одно досадное ограничение этого подхода состоит в том, что, хотя есть функция-член std::thread::native_handle()
, нет никаких std::this_thread::native_handle()
метод. Это в основном в ожидании рецензии а также хороший вариант использования быть стандартизированным.
Других решений пока нет …