私は Delphi で TThread から TMyThread オブジェクトを派生させました。TMyThread.Execute では、Visual C++ で作成された DLL を呼び出します。その場合、DLL もマルチスレッド ライブラリでコンパイルし、マルチスレッドもサポートする必要がありますか?
2 に答える
MSVC ランタイムの古いバージョンには、マルチスレッドとシングルスレッドの両方のバリエーションがあります。違いは、シングル スレッド バリアントは潜在的な競合状態から保護されないことです。そのため、MSVC ランタイムを呼び出すコードが複数のスレッドから呼び出される場合、シングルスレッド ランタイムは安全に使用できません。
説明するシナリオには、MSVC DLL 内でコードを実行するスレッドが 1 つしかありません。その場合、シングルスレッドの MSVC ランタイムは安全に使用できます。ホスト実行可能ファイルがマルチスレッドであることは重要ではありません。重要なのは、MSVC DLL にアタッチされた MSVC ランタイムを複数のスレッドが呼び出すかどうかだけです。
MSVC は、多くのリリース前に、個別のシングル スレッド ランタイムとマルチ スレッド ランタイムの出荷を停止しました。それがあなたのアプリケーションに違いをもたらすかどうか疑問に思います。2 つのランタイム オプションのパフォーマンスの違いを検出できますか? そうでない場合は、マルチスレッド ランタイムを使用するのが理にかなっています。シングル スレッド ランタイムを選択すると、将来のコード変更でこれを忘れて MSVC DLL に余分なスレッドが導入されたときに、デバッグの頭痛の種になる可能性があります。
C++ DLL を MT で使用する場合は、MT にする必要があります。アプリケーションの 1 つのスレッドからのみ使用する場合は、その必要はありません。ただし、DLL 内で内部的に管理されているデータ構造など、スレッドの競合が発生している可能性が少しでも疑わしい場合は、すぐにこれを明確に文書化する必要があります。または、とにかく MT を使用し、適切なロックに注意して、それを忘れてください。(以前の Delphi ステートメントは今でも有効です)。