Является
OutputDebugString(PAnsiChar(''));
потокобезопасность?
Я/мы использовали его в потоках для отладки, и мне никогда не приходило в голову, если я должен делать это по-другому.
(Delphi 7)
Является
OutputDebugString(PAnsiChar(''));
потокобезопасность?
Я/мы использовали его в потоках для отладки, и мне никогда не приходило в голову, если я должен делать это по-другому.
(Delphi 7)
Не беспокойтесь, это так.
Когда OutputDebugString() вызывается приложением, оно принимает эти шаги. Обратите внимание, что отказ в любой момент оставляет все это и обрабатывает запрос отладки как нет-op (строка не отправляется в любом месте).
- Откройте DBWinMutex и подождите, пока у нас не будет эксклюзивного доступа к нему.
- Сопоставьте сегмент DBWIN_BUFFER в память: если он не найден, отладчик не работает, поэтому весь запрос игнорируется.
- Откройте события DBWIN_BUFFER_READY и DBWIN_DATA_READY. Как и в случае сегмент разделяемой памяти, отсутствующие объекты означают, что никакой отладчик не является доступны.
- Подождите, пока не будет сообщено событие DBWIN_BUFFER_READY: это говорит что буфер памяти больше не используется. В большинстве случаев это событие будет сообщено сразу же после его изучения, но оно не будет подождите более 10 секунд, пока буфер не станет готовым (тайм-аут отказывается от запроса).
- Скопируйте в буфер памяти до 4 килобайт данных и сохраните текущий идентификатор процесса. Всегда ставьте байт NUL в конце строки.
- Сообщите отладчику, что буфер готов, установив DBWIN_DATA_READY событие. Отладчик берет его оттуда.
- Отключение мьютекса
- Закройте объекты Event и Section, хотя мы сохраняем дескриптор мьютекс вокруг позже.
Ну, не то, что это не так, но это так, но вам просто не нужно просто взять слово Lieven для него:
Передача данных между приложение и отладчик через 4-килобайтную часть общей памяти, с объектами Mutex и двумя Event защищая доступ к нему. Эти четыре объекта ядра.
Понимание Win32 OutputDebugString - отличная статья по этому вопросу.
У меня были проблемы, хотя, с строками в ISAPI DLL. По какой-то нечетной причине не было задано логическое значение IsMultiThread, определенное в System.pas!
Это вызывало странные AccessViolations, как только поток работал более одного потока... Простой "IsMultiThread: = true;" в инициализации блока зафиксировал его.