Правильное обращение GetLastError (и другие) в многопоточном контексте

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

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

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

9
задан Karl Strings 6 August 2010 в 17:05
поделиться

3 ответа

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

GetLastError Function

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

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

17
ответ дан 4 December 2019 в 10:30
поделиться

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

  • GetLastError : возвращаемое значение - это код последней ошибки вызывающего потока.
  • WSAGetLastError : функция WSAGetLastError возвращает последнюю ошибку, которая произошла для вызывающего потока.
2
ответ дан 4 December 2019 в 10:30
поделиться

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

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

1
ответ дан 4 December 2019 в 10:30
поделиться