2011-11-14 4 views
1

Linuxでは、これを行うためのpthread_kill()があります。私はそれに対応するWindowsを見つけようとしています。スレッドIDが与えられても、それがWindows上で実行中かどうかを判断する方法

つまり、スレッドIDを指定すると、スレッドがまだ実行中であるかどうかを判断する方法はありますか?

GetExitCodeThread()は私が見つけた最も近いものですが、スレッドIDではなくスレッドハンドルが必要です。

+0

私は、 'pthread_kill()'にはあなたの答えに記述されているのと同じ欠点があると思います。あなたはこのスレッドの人生をコントロールしていますか、それともランダムなスレッドですか? –

+0

@DavidHeffernanあなたは私たちがまだLinux上でIDリサイクルの結果としてリスクを冒していることを意味していますか? –

+1

私はあなたが移植可能なPOSIXスレッド識別子をプロセスの境界を越えて使うことはできないと考えているので、この警告はたぶんウィンドウにしか当てはまりません。 –

答えて

6

スレッドIDを使用するべきではありません。スレッドIDを再利用できるため、スレッドIDを取得した場合、そのスレッドは終了し、同じスレッドIDで別のスレッドを開始できます。

ハンドルにはこの問題はありません。スレッドが終了すると、そのスレッドへのハンドルはすべてスレッドの終了状態を反映します。

OpenThreadを使用して、特定のIDを持つスレッドのハンドルを取得できます。そのハンドルをGetExitCodeThreadに渡して、スレッドが終了したかどうかを判断できます。

+0

私は自分のマネージャーにチェックしました。彼らは、IDだけでなくハンドル(基本的にメモリアドレス)も再利用できると主張しています。だから彼らの意見では、どちらか一方を使うことにはほとんど違いはありません。実際には、彼らは20年の経験に基づいて、同じIDの再利用はめったに観察されていないと結論づけている。 –

+2

あなたのマネージャーは間違っています:スレッドへのハンドルを開くと、そのハンドルは、そのスレッドが終了してもハンドルを閉じるまで常にそのスレッドを参照します。スレッドIDの再利用が頻繁に発生するかどうかは問題ではありません。正しいプログラムでは、特定のスレッドIDが他の方法を知らない限り、常に同じスレッドを参照することはできません(たとえば、そのIDは実行中であれば有効ですが、スレッドIDは変更されません)。 –

2

要するに、いいえ、ありません。指定された識別子を持つスレッドが存在するかどうかを判断できます。ただし、指定したIDを使用して参照していたスレッドがまだ実行中であるかどうかは基本的に判断できません。これは、スレッドが完了した後にスレッドIDがリサイクルされるためです。

スレッドの有効期間を追跡するには、スレッドハンドルを取得する必要があります。スレッドハンドルを使用すると、必要なだけスレッドを有効に保つことができます。これを強力なVSと考えてください。弱い参照物。 OpenThread()を使用すると、IDを指定してスレッドへのハンドルを取得できます。あなたはIDを取得した後でこれをできるだけ早く行い、その後常にスレッドハンドルを使用しなければなりません。

+0

あなたはIDが私たちにハンドルを与えることを意味します、そしてハンドルは私たちに実行状態を与えますか?そうであれば、IDから実行ステータスを取得できます。 –

+0

はい、それはあなたがテストする*スレッドの状態を確実に知らないので、信頼できない方法です。関心のあるスレッドが終了し、すべてのハンドルが閉じられている場合、他のプロセスはその識別子を使用する可能性のあるスレッドを作成することがあります。それ以降にテストが実行されると、偽陽性となります。 idリサイクル物のため –

+0

? Andreに感謝します。 –

関連する問題