Подтвердить что ты не робот

В Delphi поток OutputDebugString безопасен?

Является

OutputDebugString(PAnsiChar(''));

потокобезопасность?

Я/мы использовали его в потоках для отладки, и мне никогда не приходило в голову, если я должен делать это по-другому.

(Delphi 7)

4b9b3361

Ответ 1

Не беспокойтесь, это так.

Когда OutputDebugString() вызывается приложением, оно принимает эти шаги. Обратите внимание, что отказ в любой момент оставляет все это и обрабатывает запрос отладки как нет-op (строка не отправляется в любом месте).

  • Откройте DBWinMutex и подождите, пока у нас не будет эксклюзивного доступа к нему.
  • Сопоставьте сегмент DBWIN_BUFFER в память: если он не найден, отладчик не работает, поэтому весь запрос игнорируется.
  • Откройте события DBWIN_BUFFER_READY и DBWIN_DATA_READY. Как и в случае сегмент разделяемой памяти, отсутствующие объекты означают, что никакой отладчик не является доступны.
  • Подождите, пока не будет сообщено событие DBWIN_BUFFER_READY: это говорит что буфер памяти больше не используется. В большинстве случаев это событие будет сообщено сразу же после его изучения, но оно не будет подождите более 10 секунд, пока буфер не станет готовым (тайм-аут отказывается от запроса).
  • Скопируйте в буфер памяти до 4 килобайт данных и сохраните текущий идентификатор процесса. Всегда ставьте байт NUL в конце строки.
  • Сообщите отладчику, что буфер готов, установив DBWIN_DATA_READY событие. Отладчик берет его оттуда.
  • Отключение мьютекса
  • Закройте объекты Event и Section, хотя мы сохраняем дескриптор мьютекс вокруг позже.

Ответ 2

Ну, не то, что это не так, но это так, но вам просто не нужно просто взять слово Lieven для него:

Передача данных между приложение и отладчик через 4-килобайтную часть общей памяти, с объектами Mutex и двумя Event защищая доступ к нему. Эти четыре объекта ядра.

Понимание Win32 OutputDebugString - отличная статья по этому вопросу.

Ответ 3

У меня были проблемы, хотя, с строками в ISAPI DLL. По какой-то нечетной причине не было задано логическое значение IsMultiThread, определенное в System.pas!

Это вызывало странные AccessViolations, как только поток работал более одного потока... Простой "IsMultiThread: = true;" в инициализации блока зафиксировал его.