Скажем, я использую APC, где процедура и вызывающий код используют SetLastError и GetLastError. Это приводит к непредсказуемым значениям из GetLastError. Есть ли выход из этого?Гонка GetLastError при вызове асинхронной процедуры
VOID CALLBACK MyFunction(ULONG_PTR param)
{
SetLastError(1);
// Doing some stuff here which takes some time
// Expecting 1 but can I/should I get 0 here ?
printf("LastError: %d\n", GetLastError());
}
int APCtry()
{
SetLastError(0);
DWORD dummy = 0;
if (!QueueUserAPC(MyFunction, GetCurrentThread(), dummy))
{
return 0;
}
printf("LastError: %d\n", GetLastError());
SleepEx(100, TRUE);
//SetLastError(0); Edited and commented
printf("LastError: %d\n", GetLastError());
return 0;
}
Не используйте SetLastError и GetLastError. Определите механизм отчетности об ошибках приложения. –
@SamVarshavchik [Документация MSDN для 'GetLastError()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx) указывает значение зависит от потока: * Возвращает значение кода последней ошибки вызывающего потока. Код последней ошибки поддерживается для каждого потока. Несколько потоков не перезаписывают код последней ошибки. * Я бы сказал, что вопрос требует гораздо больше данных. Там, конечно, нет [MCVE] (http://stackoverflow.com/help/mcve). –
Я удалил теги языка, так как это концептуально, и вы не предложили никакого кода. Однако я подозреваю, что предоставление кода, вероятно, поможет вам получить более конкретные ответы. –