Правильный ли это способ создать тему и установить сходство с помощью std::thread
?
std::thread myThread(threadFunction);
HANDLE threadHandle = myThread.native_handle();
SetThreadAffinityMask(threadHandle, 1);
Вам следует указать реализацию компилятора и/или стандартной библиотеки, о которой вы спрашиваете. Любое использование native_handle()
определяется реализацией. По крайней мере, я отметил windows
, потому что это похоже на Windows API.
Какой компилятор вы используете? VS2022 не поддерживает C++11, поэтому я предполагаю, что вы используете другой компилятор.
Выглядит нормально. Проверьте, удалось ли SetThreadAffinityMask
Я удалил вызов myThread.join()
из конца вашего примера. Я сделал это по двум причинам: (1) присоединение к теме не имело никакого отношения к вопросу, который вы задали, и (2) поскольку между SetThreadAffinityMask(...)
и join
не было других утверждений, это фактически был пример анти- узор. Никогда не имеет смысла создавать новый поток, если вызывающий объект не выполняет какую-либо работу одновременно с новым потоком до того, как вызывающий объект в конечном итоге присоединится к нему.
@TedLyngmo, что вы подразумеваете под «VS2022 не поддерживает C++11»? Вы хотите сказать, что vcpp неправильно реализует стандарт?
@AluanHaddad Я имею в виду, что невозможно перевести его в режим C++11, поэтому вы не можете использовать такую функцию, как std::gets (и это хорошо). Возможные варианты: C++14, 17, 20 и новейшие версии.
@TedLyngmo, спасибо. Я согласен, что хорошо, что люди в конечном итоге не будут программировать для устаревшей версии, но я все еще скучаю по тем дням, когда Microsoft действительно заботилась о bc. Когда Microsoft действительно заботилась об обратной совместимости (я должен был усвоить урок после победы на RT).
Да, это правильно.
Если в какой-то момент вы захотите вернуть исходную маску, SetThreadAffinityMask
также возвращает старую маску:
HANDLE threadHandle = myThread.native_handle();
DWORD_PTR new_mask = 1;
DWORD_PTR old_mask = SetThreadAffinityMask(threadHandle, new_mask);
Если old_mask
равен нулю, установка сходства не удалась.
Пожалуйста, прочитайте это: Как мне задать хороший вопрос?