Вопрос по c++, multithreading, winapi, windows, c++11 – Как получить идентификатор winapi для потока, созданного с использованием стандартной библиотеки?

8

тандартная библиотека @ C ++ 11 содержит<thread> который позволяет создавать темы. Однако для API Windows требуется идентификатор для некоторых функций PostThreadMessage, а именно). Как я могу получить это?

примечание:std::thread::get_id() не работает:

PostThreadMessage(m_thread->get_id(), WM_QUIT, 0, 0);

e:\documents\khook\khooker\hook_runner.cpp(129): error C2664: 'PostThreadMessageW' : cannot convert parameter 1 from 'std::thread::id' to 'DWORD'
ДелаетGetCurrentThreadId Работа? Даже из другого потока вы можете использовать его из рассматриваемого потока и сохранить его, если он работает в первую очередь. chris

Ваш Ответ

2   ответа
12

native_handle(). Это обеспечивает ручную нить. Тогда вы можете позвонитьGetThreadId() в теме

Обратите внимание, чтоnative_handle() возвращаетHANDLE (void*) для темы; вам также понадобитсяGetThreadId() чтобы получить идентификатор из дескриптора для вызоваPostThreadMessage(). James McNellis
@ Джеймс добавил, спасибо. R. Martinho Fernandes
0

thread::id класс позволяет только сравнение междуids и вывод. Он не предоставляет средства для доступа к фактическому базовоid. Вы можете попробовать вывести его наstringstream а потом снова разбираю, наверное.

Я не понимаю, как поможет струнный поток? qdii
@ Qdii, ID знает, как напечатать себя в поток (для отладки). Реализация происходит просто для печати своего числового значения. Если у вас есть числовое значение в потоке строки, вы можете прочитать его обратно в числовой тип. Rob Kennedy
@ RobKennedy: могу ли я быть уверен, чтоthread::id такое же значение, как значение API Windows? (Я думал, что это может быть значение промежуточной библиотеки, например, pthread). qdii
Ну да, но, кстати, так и моглоnative_handle. «Нативная» часть относится только к той части, которая не определена в C ++. Как только вы пройдете через это, «native» означает то, что реализация хочет или нуждается в этом. Если библиотека потоков реализована непосредственно в терминах ОС, то это, вероятно, дескриптор и идентификатор ОС, но если между ними есть другая библиотека потоков, например, pthread, то это может быть значение, специфичное для pthread. Любой из них считается «нативным» со стандартной точки зрения C ++.idначение @ определяется реализацией, поэтому проверьте вашу реализацию. Rob Kennedy

Похожие вопросы