Как определить, что поток 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;

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