Использование std::thread и Native_handle() для установки маски привязки потока

Правильный ли это способ создать тему и установить сходство с помощью std::thread?

std::thread myThread(threadFunction);

HANDLE threadHandle = myThread.native_handle();

SetThreadAffinityMask(threadHandle, 1);

Пожалуйста, прочитайте это: Как мне задать хороший вопрос?

Lex W. 17.08.2024 18:21

Вам следует указать реализацию компилятора и/или стандартной библиотеки, о которой вы спрашиваете. Любое использование native_handle() определяется реализацией. По крайней мере, я отметил windows, потому что это похоже на Windows API.

user17732522 17.08.2024 19:01

Какой компилятор вы используете? VS2022 не поддерживает C++11, поэтому я предполагаю, что вы используете другой компилятор.

Ted Lyngmo 17.08.2024 19:06

Выглядит нормально. Проверьте, удалось ли SetThreadAffinityMask

catnip 17.08.2024 19:07

Я удалил вызов myThread.join() из конца вашего примера. Я сделал это по двум причинам: (1) присоединение к теме не имело никакого отношения к вопросу, который вы задали, и (2) поскольку между SetThreadAffinityMask(...) и join не было других утверждений, это фактически был пример анти- узор. Никогда не имеет смысла создавать новый поток, если вызывающий объект не выполняет какую-либо работу одновременно с новым потоком до того, как вызывающий объект в конечном итоге присоединится к нему.

Solomon Slow 19.08.2024 03:49

@TedLyngmo, что вы подразумеваете под «VS2022 не поддерживает C++11»? Вы хотите сказать, что vcpp неправильно реализует стандарт?

Aluan Haddad 19.08.2024 04:10

@AluanHaddad Я имею в виду, что невозможно перевести его в режим C++11, поэтому вы не можете использовать такую ​​функцию, как std::gets (и это хорошо). Возможные варианты: C++14, 17, 20 и новейшие версии.

Ted Lyngmo 19.08.2024 06:17

@TedLyngmo, спасибо. Я согласен, что хорошо, что люди в конечном итоге не будут программировать для устаревшей версии, но я все еще скучаю по тем дням, когда Microsoft действительно заботилась о bc. Когда Microsoft действительно заботилась об обратной совместимости (я должен был усвоить урок после победы на RT).

Aluan Haddad 19.08.2024 06:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это правильно.

Если в какой-то момент вы захотите вернуть исходную маску, SetThreadAffinityMask также возвращает старую маску:

HANDLE threadHandle = myThread.native_handle();

DWORD_PTR new_mask = 1;
DWORD_PTR old_mask = SetThreadAffinityMask(threadHandle, new_mask);

Если old_mask равен нулю, установка сходства не удалась.

Другие вопросы по теме