5

そのため、CreateThread と CRT によってメモリ リークが発生する可能性があり、シグナルが機能せず、_beginthread または _beginthreadex 関数を使用する必要があることを理解しています。

アプリケーションを作成する場合はこれで問題ありませんが、他のアプリケーション (プレーンな c dll、com オブジェクト、プラグインなど) の dll などを作成する場合はどうでしょうか。DLL を呼び出すスレッドがどのように作成されたかを保証する方法はありません。たとえ __beginthread(ex) を使用したとしても、CRT の実装\バージョンが異なる可能性が高いでしょう。

では、プログラマーに期待されていることは正確には何ですか? CRTを使用しないのですか?内部スレッドを生成し、すべての作業をそのスレッドにオフロードしますか (呼び出しスレッドで CRT を使用せずに)? スレッドの作成方法に関係なく、すべてのスレッドを正しくセットアップおよびシャットダウンするための DllMain とアタッチ/デタッチに関するいくつかのトリックはありますか?

4

2 に答える 2

10

CreateThread と CRT によってメモリ リークが発生する可能性がある

いいえ、それは何らかの理由で取り除くのが信じられないほど難しい誤解です. _beginthread() を使用することは、前世紀には必要でした。VS6 は、依然としてそれを必要とする CRT を備えた VS の最後のバージョンでした。

Windows 2000 に追加されたスレッド プールのサポートに対処するために、これは修正されました。明らかに、CRT でそれらを処理することはできません。これらのスレッドは、OS 自体によって開始されます。実装は非常に簡単です。strtok() で必要な変数のように、CRT がスレッド ローカル変数を必要とする場合は常に、TLS ストレージがスレッドに既に割り当てられているかどうかを最初に確認します。そうでない場合は、オンザフライで割り当てます。

もちろん、14 年前のコンパイラをもう使用しないという前提で暗黙的に、恐れることなく CreateThread() を使用してください。

于 2012-08-04T16:35:18.280 に答える
2

次の 2 つのオプションがあります。

  1. DLL から CRT を使用しないでください。
  2. サポートされているツールチェーンのバージョンごとに 1 つずつ、複数の DLL を出荷します。

1 が受け入れられない場合は、2 が選択されます。とにかく複数の DLL を出荷する必要があることに注意してください。たとえば、ユーザーが 32 ビットおよび64 ビット アーキテクチャ用にコンパイルする場合などです。

于 2012-08-04T12:16:26.293 に答える