Проверьте, работает ли поток Win32 или в состоянии ожидания

Я решил использовать модуль Джексона для Scala .

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val obj = mapper.readValue[Map[String, Object]](jsonString)

16
задан random 21 July 2011 в 03:01
поделиться

6 ответов

Я думаю - изначально - эта информация не была предоставлена, потому что любой API, предоставляющий эту информацию, будет вводить в заблуждение и бесполезен.

Рассмотрим два возможных случая - текущий поток приостановил выполнение потока -интерес. Код в текущем потоке знает о приостановленном состоянии и должен иметь возможность поделиться им, поэтому команде ядра нет необходимости добавлять API.

Второй случай, какой-то другой / третий поток в система приостановила интересующий поток (и нет возможности отследить, какой поток это был). Теперь у вас есть состояние гонки - этот другой поток может в любой момент - отменить приостановку интересующего потока, а информация, полученная из API, бесполезна - у вас есть значение, указывающее, что поток приостановлен, хотя на самом деле это не так.

Мораль истории - если вы хотите знать, что поток приостановлен - приостановите его: возвращаемое значение SuspendThread - это предыдущий счетчик приостановки потока. И теперь вы ДЕЙСТВИТЕЛЬНО знаете кое-что полезное - ветка БЫЛА И ЕЩЕ ПРИОСТАНОВЛЕНА - что полезно. Или что это НЕ БЫЛО (но сейчас) приостановлено. В любом случае, состояние потока теперь детерминированно известно, поэтому теоретически вы можете сделать на его основе разумный выбор - использовать ResumeThread или оставить его приостановленным.

15
ответ дан 30 November 2019 в 22:02
поделиться

Класс Win32_Thread WMI имеет свойство ThreadState , где 5: «Приостановлено, заблокировано» и 6: Приостановлено, готово.

Вам понадобится идентификатор потока, чтобы получить нужный экземпляр напрямую (свойство Handle объекта WMI является идентификатором потока).

РЕДАКТИРОВАТЬ: Учитывая этот запрос PowerShell:

gwmi win32_thread | group ThreadState

дает

Count Name  Group
----- ----  -----
    6 2     {, , , ...}
  966 5     {, , , ...}

WMI имеет другое определение «приостановлено», чем Win32.

2
ответ дан 30 November 2019 в 22:02
поделиться

In Windows 7, you can use QueryUmsThreadInformation. (UMS stands for User mode scheduling).

See here for UmsThreadIsSuspended.

1
ответ дан 30 November 2019 в 22:02
поделиться

вы можете получить счетчик приостановленных потоков с помощью такого кода:

DWORD GetThreadSuspendCount(HANDLE hThread) {
    DWORD dwSuspendCount = SuspendThread(hThread);
    ResumeThread(hThread);
    return dwSuspendCount;
}

, но, как уже было сказано, это неточно. Более того, приостановить цепочку - зло.

1
ответ дан 30 November 2019 в 22:02
поделиться

Я думаю, что состояние здесь упоминается как

  • Если поток находится в процессе потока, выполняет некоторую обработку Или
  • Ожидание события

Об этом можно позаботиться, используя переменная, которая может сказать, что если поток действительно запущен или ожидает события.

Эти сценарии появляются при рассмотрении пулов потоков, имеющих несколько n потоков, и в зависимости от состояния работы каждого потока задачи могут быть назначены незанятым потокам.

0
ответ дан 30 November 2019 в 22:02
поделиться

Вы можете получить эту информацию, вызвав NtQuerySystemInformation () со значением для SystemProcessesAndThreadsInformation (целочисленное значение 5).

Если вам нужен пример того, что можно сделать с этой информацией, посмотрите Монитор состояния потока .

3
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

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