16

OutputDebugString(PAnsiChar(''));

スレッドセーフ?

私/私たちはデバッグのためにスレッドでそれを使用してきました、そして私がそれを別の方法で行うべきであるかどうか私には決して起こりませんでした。

(Delphi 7)

4

3 に答える 3

26

Well, not that it isn't true, it is, but just so that you don't have to just take Lieven word for it:

アプリケーションとデバッガー間のデータの受け渡しは、4kバイトの共有メモリチャンクを介して行われ、ミューテックスと2つのイベントオブジェクトがそのアクセスを保護します。これらは、関係する4つのカーネルオブジェクトです。

Win32 OutputDebugStringを理解することは、この問題に関する優れた記事です。

于 2009-02-03T23:55:23.647 に答える
18

心配しないでください。

OutputDebugString()がアプリケーションによって呼び出されると、これらの手順が実行されます。いずれかの時点で障害が発生すると、すべてが破棄され、デバッグ要求がノーオペレーションとして扱われることに注意してください(文字列はどこにも送信されません)。

  1. DBWinMutexを開き、排他的にアクセスできるようになるまで待ちます。
  2. DBWIN_BUFFERセグメントをメモリにマップします。見つからない場合は、デバッガーが実行されていないため、要求全体が無視されます。
  3. DBWIN_BUFFER_READYイベントとDBWIN_DATA_READYイベントを開きます。共有メモリセグメントと同様に、オブジェクトがないということは、デバッガが利用できないことを意味します。
  4. DBWIN_BUFFER_READYイベントが通知されるのを待ちます。これは、メモリバッファが使用されなくなったことを示します。ほとんどの場合、このイベントは検査されるとすぐに通知されますが、バッファーの準備が整うまで10秒以上待機することはありません(タイムアウトによって要求が破棄されます)。
  5. 最大約4kバイトのデータをメモリバッファにコピーし、現在のプロセスIDもそこに保存します。文字列の最後に常にNULバイトを配置します。
  6. DBWIN_DATA_READYイベントを設定して、バッファーの準備ができていることをデバッガーに通知します。デバッガーはそこからそれを取得します。
  7. ミューテックスを解放します
  8. EventオブジェクトとSectionオブジェクトを閉じますが、後で使用するためにミューテックスへのハンドルを保持します。
于 2009-02-03T23:43:11.610 に答える
3

ただし、ISAPI DLL 内の文字列で一度問題が発生しました。奇妙な理由で、System.pas で定義された IsMultiThread ブール値が設定されていませんでした!

スレッドが複数のスレッドを実行すると、奇妙な AccessViolations が発生していました...単純な「IsMultiThread:=true;」ユニットの初期化で修正しました。

于 2009-04-07T06:43:54.657 に答える