在Delphi中,OutputDebugString线程安全吗?

Chr*_*ase 16 delphi multithreading delphi-7 outputdebugstring

OutputDebugString(PAnsiChar(''));
Run Code Online (Sandbox Code Playgroud)

线程安全?

我/我们一直在线程中使用它来进行调试,如果我以不同的方式做这件事我就不会想到它.

(德尔福7)

Jor*_*oba 26

嗯,不是说它不是真的,它是,但只是为了让你不必只是为了它而得到Lieven的话:

应用程序和调试器之间的数据传递是通过一个4k字节的共享内存块完成的,其中一个Mutex和两个Event对象保护对它的访问.这些是涉及的四个内核对象.

了解Win32 OutputDebugString是一篇很好的文章.


Lie*_*ers 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对象,尽管我们将句柄保持在互斥体上以便以后使用.