10

私はWindowsAPIの初心者ですが、最近、CreateThreadとTerminateThreadを使用すべきではないことを学びました。に切り替えましたが_beginthreadex、どうしたらいいのかわかりませんかuse _endthreadex

たとえば、これは私がテストしていた基本的な関数です。

// MyThreadFunction - outputs "#.) I Work" and ends
unsigned int __stdcall MyThreadFunction( void * lpParam ) 
{
    int i = (int)lpParam;
    cout << i << ".) I work! " << endl;
    _endthreadex(0);
    return 0;
}

私の配置は_endthreadex正しいですか?私は0を返す前にそれを持っています、それは私には奇妙に思えますか?関数の終了時に自動的に呼び出されることについてmsdnページで読みましたが_endthreadex、メモリのクリーンアップを改善するために呼び出す必要があるため、入れてみました。正しくないようです。これが悪い質問です。私は自分の能力を最大限に発揮してすべてを正しく行っていることを確認したいだけです

4

3 に答える 3

9

実際に電話する必要はまったくありません_endthreadex()。とにかくスレッド関数が戻った後、自動的に呼び出されます。

于 2013-01-13T03:48:24.323 に答える
4

答えはすでに短いバージョンで示されています。詳細を知りたい場合は、関数からの戻り値が実際に_endthreadex呼び出しの引数として使用されます。スレッドを開始するときにランタイムが実行することは次のとおりです。スレッドは実際、CRTのどこかで開始点から開始され、内部_callthreadstartexで次のことを実行しています。

_endthreadex(MyThreadFunction(...));

つまり、戻る_endthreadexとすぐに呼び出され、スレッドから終了します。

明示的に使用できますか?はい、できます。途中でリークが発生しない限り(特に、まだデストラクタと呼ばれていない場合など)、コードを自分で呼び出すか、呼び出されるかはそれほど重要ではないため、コードも優れています。ローカル変数)。

それはとにかくあなたのために呼び出され、関数からの復帰はローカルリソースを解放するという点でより安全であるため、明示的な呼び出しを行うための使用、利点、および意味はありません。

MSDNは基本的に、備考セクションでまったく同じことを説明しています。

_endthreadまたは_endthreadexを明示的に呼び出して、スレッドを終了できます。ただし、_endthreadまたは_endthreadexは、スレッドがパラメーターとして_beginthreadまたは_beginthreadexに渡されたルーチンから戻るときに自動的に呼び出されます。endthreadまたは_endthreadexの呼び出しでスレッドを終了すると、スレッドに割り当てられたリソースを適切に回復できます。

于 2013-01-13T13:21:09.087 に答える
2

すでに述べたように、あなたはそれを呼ぶ必要はありません。あなたのコードに関しては、ファイナルは二度と戻らないreturn 0;ので呼び出されることさえないと思います。_endthreadex()これにより、ローカルオブジェクトのデストラクタが呼び出されなくなる可能性もあります(これは、MSDNが言いたかったことです)。したがって、この関数を使用すると、C++でも有害になる可能性があります。Boost.Threadの使用を検討してください。これらには、スレッドの終了専用の例外があります。これは、スレッドを途中で終了する場合に適切な処理を実行する必要があります。

于 2013-01-13T11:09:03.113 に答える