Правильная обработка GetLastError (и других) в многопоточном контексте - PullRequest
9 голосов
/ 06 августа 2010

Правильно ли предположить, что GetLastError (и варианты) являются для каждого потока или для каждого процесса? Проблемы, связанные с процессом, несколько очевидны в многопоточных приложениях, потому что нет способа гарантировать, что между вашими ошибочными вызовами и GetLastError не было никаких других вызовов Win32. Иногда значение GetLastError важно.

Например, AcceptEx вернет FALSE (сбой), если вы используете порты завершения ввода-вывода. WSAGetLastError (аналогично GetLastError) вернет ERROR_IO_PENDING, чтобы сообщить вам, что он отложен и ошибка не вызвана чем-то другим. Проблема в том, что десятки других звонков могут быть в полете и перезаписать это значение.

Являются ли эти вызовы потоком или процессом? Если процесс конкретный, то как вы справляетесь с этим правильно?

Ответы [ 3 ]

17 голосов
/ 06 августа 2010

документы абсолютно однозначны по этому поводу:

Функция GetLastError

Извлекает значение кода последней ошибки вызывающего потока.Код последней ошибки поддерживается для каждого потока.Несколько потоков не перезаписывают код последней ошибки друг друга.

Таким образом, они сказали это три раза (в одном абзаце!): Должно быть достаточно, как сказал Льюис Кэрролл ;-).Таким образом, нет необходимости отвечать на гипотетические предложения, такие как «но если это был процесс, а не поток, то как насчет ...?»; -).

2 голосов
/ 06 августа 2010

Оба GetLastError и WSAGetLastError возвращают коды ошибок для каждого потока.Посмотрите записи MSDN:

  • GetLastError : Возвращаемое значение - код последней ошибки вызывающего потока.
  • WSAGetLastError : Функция WSAGetLastError возвращает последнюю ошибку, произошедшую для вызывающего потока.
1 голос
/ 06 августа 2010

Вы можете прочитать в MSDN (см. http://msdn.microsoft.com/en-us/library/ms679360.aspx) Четкий ответ на ваш вопрос:

Извлекает вызывающий поток значение кода последней ошибки. Последняя ошибка код поддерживается для каждого потока основа. Несколько потоков не переписать последнюю ошибку друг друга Код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...