Как определить, что поток Win32 находится в состоянии ожидания или соединения или сна в C++
Что я на самом деле ищу, так это эквивалент C++/win32 для перечисления.net ThreadState.
Какие-либо предложения?
4 ответа
Между ними очень мало различий, все ждут разные объекты ядра.
Под "ждать" я предполагаю, что вы имеете в виду "I/O wait". "Присоединиться" - это просто "ждать потока / процесса". А "Сон" - это "ждать таймера".
Чтобы еще больше усложнить ситуацию, поток может ожидать некоторую комбинацию объектов ядра.
Вы можете узнать, какие объекты ожидает поток, и тип этих объектов, используя отладчик ядра. Я не думаю, что есть более простой способ.
Прямого эквивалента не существует - управляемые и неуправляемые потоки не следует считать одинаковыми. Смотрите здесь.
ThreadId операционной системы не имеет фиксированной связи с управляемым потоком, потому что неуправляемый хост может контролировать отношения между управляемыми и неуправляемыми потоками. В частности, сложный хост может использовать Fiber API для планирования многих управляемых потоков в одном потоке операционной системы или для перемещения управляемого потока между различными потоками операционной системы.
Проблема заключается в том, что среда выполнения.NET владеет вашим потоком.NET. Так, например, когда вы вызываете Abort, внутреннее устройство времени выполнения выдает исключение ThreadAbortException в контексте.NET вашего потока.NET, и именно так вы можете перехватить его в своем потоке, используя catch(ThreadAbortException).
То же самое верно и для ThreadState, так как он имеет базовое владение вашим потоком, он точно знает, что он делает, и, следовательно, может создать действительное состояние потока.
Поскольку нет никакого нехакенского способа официально запросить у потока его внутреннее состояние, вы можете заключить это в класс. Но опять же, вы бы полностью зависели от метода потока, чтобы придерживаться любых.Abort()- запросов.
Единственное состояние нативного потока, легко доступное с помощью winapi, - это информация о том, завершил ли поток свое выполнение. Просто используйте функцию WaitForSingleObject()
с ручкой потока и временем ожидания 0:
DWORD res = WaitForSingleObject(handleThread, 0);
switch (res)
{
case WAIT_OBJECT_0:
printf("The thread has finished\n");
break;
case WAIT_TIMEOUT:
printf("The thread is still running\n");
break;
default:
printf("Unknown error (shouldn't happen)\n");
break;
}