Multithreading 在Delphi中,OutputDebugString是线程安全的吗?

Multithreading 在Delphi中,OutputDebugString是线程安全的吗?,multithreading,delphi,delphi-7,outputdebugstring,Multithreading,Delphi,Delphi 7,Outputdebugstring,是 线程安全 我/我们一直在线程中使用它进行调试,我从来没有想过是否应该以不同的方式进行调试 (德尔菲7)别担心,它是 当应用程序调用OutputDebugString()时,它会执行以下操作 步骤。请注意,在任何一点上的失败都会放弃整个过程,并 将调试请求视为无操作(未发送字符串 任何地方) 打开DBWinMutex并等待,直到我们以独占方式访问它 将DBWIN_缓冲区段映射到内存中:如果找不到, 没有正在运行的调试器,因此将忽略整个请求 打开DBWIN_BUFFER_READY和DBWIN_

线程安全

我/我们一直在线程中使用它进行调试,我从来没有想过是否应该以不同的方式进行调试

(德尔菲7)

别担心,它是

当应用程序调用OutputDebugString()时,它会执行以下操作 步骤。请注意,在任何一点上的失败都会放弃整个过程,并 将调试请求视为无操作(未发送字符串 任何地方)

  • 打开DBWinMutex并等待,直到我们以独占方式访问它
  • 将DBWIN_缓冲区段映射到内存中:如果找不到, 没有正在运行的调试器,因此将忽略整个请求
  • 打开DBWIN_BUFFER_READY和DBWIN_DATA_READY事件。如同 在共享内存段中,缺少对象意味着没有调试器 可用
  • 等待DBWIN_BUFFER_READY事件发出信号:这表示 内存缓冲区不再使用。大多数时候,这个 事件在检查时会立即发出信号,但不会 等待缓冲区准备就绪的时间超过10秒(超时 放弃请求)
  • 将最多约4KB的数据复制到内存缓冲区,并存储 当前进程ID也在那里。始终在末尾添加NUL字节 线的长度
  • 通过设置 DBWIN_数据_就绪事件。调试器从那里获取它
  • 释放互斥锁
  • 关闭事件和节对象,尽管我们将句柄保持为 该互斥锁将在以后使用

  • 不是说这不是真的,是真的,只是为了让你不必相信Lieven的话:

    在服务器之间传递数据 应用程序和调试器已完成 通过4字节的共享内存块, 使用一个互斥对象和两个事件对象 保护对它的访问。这些是 涉及四个内核对象


    这是一篇关于这个问题的优秀文章。

    不过,我曾经在ISAPI DLL中遇到过字符串问题。出于某些奇怪的原因,System.pas中定义的IsMultiThread布尔值未设置


    一旦线程运行多个线程,就会导致奇怪的访问冲突。。。单元初始化中的一个简单的“IsMultiThread:=true;”修复了它。

    谢谢,正是我想听到的:)我知道它是线程安全的,因为我曾经不得不自己查找它。但我不知道它背后的整个故事了。谢谢你澄清。@Stijn,这是什么版本的Delphi?当我打开Delphi 2007应用程序时,IDE将此变量显示为
    true
    OutputDebugString(PAnsiChar(''));