Узнать состояни чужого thread'а... или опасно ли делать ResumeThread?

Тема в разделе "WASM.WIN32", создана пользователем djmans, 12 авг 2008.

  1. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    сабж собственно
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    djmans
    Не совсем понятен вопрос твой вопрос. ResumeThread вообще вызывать не стоит, если до этого не вызывал SuspendThread. А если вызывал, то в чём опастность может быть, по твоему?

    Попробую в телепата поиграть:) Если ты боишься, что вызвав пару SuspendThread|ResumeThread для потока, который уже Suspend, ты его запустишь, то зря. Т.к.
     
  3. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    ну допустим процесс A засуспендил зачемто свой поток t1, и тут процесс B врываеца и суспендид поток t1, что-то делает с ним и рассуспендивает. Дык вот в такой ситуации опасен ли вприцпе ResumeThread(хотя я сам себя уже не понел) из потока B. Или как можно универсально для всей ветки 2k+ узнать состояние потока?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    djmans
    Если ты сначала суспендишь поток, а затем резъюмишь, то сам по себе Resume не опасен, т.к. при этом соблюдается баланс инк\дек suspend-count. Опасны могут быть только твои манипуляции с контекстом потока :)
    Универсального средства узнать, что поток suspended или в принципе не существует или оно бесполезно, т.к. после того как ты узнал, что поток спит, он в любой момент может проснуться, если ему не сделать еще один suspend
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если поток небыл остановлен, то ETHREAD.Tcb.SuspendCount = 0 и при вызове NtResumeThread(->KeResumeThread) ничего не происходит с потоком. В ядре проверка на ноль.
    Юзать это безопасно, конечно если ненадолго, поток может ждать обьект.

    Состояние потока определяется из NtQuerySystemInformation(SystemProcessesAndThreadsInformation), SYSTEM_THREAD_INFORMATION.State и WaitReason.
    SuspendCount - возвращает NtSuspendThread.