3

私が実際に検索するのは、.net ThreadState Enumerationに相当する c++/win32です。

助言がありますか?

4

4 に答える 4

3

これらの間にはほとんど違いがなく、すべてが異なるカーネル オブジェクトを待機しています。

「待機」とは、「I / O待機」を意味すると思います。「参加」は「スレッド/プロセスを待つ」だけです。そして「スリープ」は「タイマー待ち」です。

さらに複雑なことに、スレッドはカーネル オブジェクトの組み合わせを待機している可能性があります。

カーネル デバッガーを使用して、スレッドが待機しているオブジェクトと、それらのオブジェクトの種類を調べることができます。これ以上簡単な方法はないと思います。

于 2011-11-18T16:18:34.963 に答える
2

直接同等のものはありません。マネージ スレッドとアンマネージ スレッドを同じものと見なすべきではありません。ここを参照してください。

アンマネージド ホストはマネージド スレッドとアンマネージド スレッドの関係を制御できるため、オペレーティング システムの ThreadId とマネージド スレッドとの関係は固定されていません。具体的には、洗練されたホストはファイバー API を使用して、同じオペレーティング システム スレッドに対して多くのマネージド スレッドをスケジュールしたり、異なるオペレーティング システム スレッド間でマネージド スレッドを移動したりできます。

于 2011-11-18T16:25:21.020 に答える
1

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;

}
于 2011-11-18T22:34:04.620 に答える
1

「問題」は、.NET ランタイムが .NET スレッドの所有権を持っていることです。たとえば、Abort を呼び出すと、実行時の内部処理によって .NET スレッドの .NET コンテキストで ThreadAbortException 例外がスローされます。これが、catch(ThreadAbortException) を使用してスレッドでキャッチできる方法です。

ThreadState にも同じことが当てはまります。これはスレッドの基本的な所有権を持っているため、何を行っているかを正確に認識しているため、有効なスレッド状態を生成できます。

スレッドの内部状態を公式に問い合わせるハッキング以外の方法はないため、これをクラスにまとめることができます。しかし、繰り返しになりますが、.Abort() 要求に従うには、スレッド メソッドに完全に依存することになります。

于 2012-09-20T06:04:49.007 に答える