Кроссплатформенная функция привязки потоков

Я использую многопоточность C ++ 11 и мне нужно установить привязку потока к определенному ядру процессора (планировщик windows не передает ядро ​​интеллектуально, и я хочу контролировать, какой поток идет к какому ядру).

Для окон есть

SetThreadAffinityMask(GetCurrentThread(), affinity);

Как будет выглядеть одна кроссплатформенная функция, которая будет работать в Windows, Linux и OSX со всеми изменениями базовых библиотек потоков (потоков Windows, pthreads и т. Д.)?

2

Решение

Если часть 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() метод. Это в основном в ожидании рецензии а также хороший вариант использования быть стандартизированным.

1

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

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

По вопросам рекламы [email protected]