На windows 7 поток кажется зависшим на _endthreadex, а Waitforsingleobject с таймаутом не сигнализирует - PullRequest
0 голосов
/ 03 августа 2020

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

У нас есть поток, реализованный в одноэлементном классе для вызова API-интерфейсов Beep и Sleep в al oop. Итак, мы запускаем поток для их вызова, а затем через некоторое время прерываем l oop, waitforsingleobject с тайм-аутом в основном потоке и выходим из потока. Непосредственно перед возвратом из функции потока мы вызываем _endthreadex. Здесь есть зависание. Теперь я не знаю, не работает ли _endthreadex и как он останавливает объект waitforsingle от передачи сигналов после тайм-аута. Код реализован очень похоже на то, что описано в качестве примера для _beginthreadex. Как я уже сказал, это происходит очень случайно и на нескольких машинах.

unsigned __stdcall SecondThreadFunc( void* pArguments )

{

printf( "In second thread...\n" );

while( m_iBeepMode == iBEEPON )

{

Beep(600, 100);

Sleep(100);

}

//I added a logging here, which gets logged in hang case.

_endthreadex( 0 );

return 0;

}

int main()

{

HANDLE hThread;

unsigned threadID;

printf( "Creating second thread...\n" );

// Create the second thread.

hThread = (HANDLE)_beginthreadex( NULL, 16384, &SecondThreadFunc, this, 0, &threadID );

// the below code is not exactly in the same method. We call it at a later time to stop the beep.

m_iBeepMode = BEEPOFF;

WaitForSingleObject( hThread, 10000 );

// Added a logging here, which doesn't get logged.

// Destroy the thread object.

CloseHandle( hThread );

}

1 Ответ

0 голосов
/ 03 августа 2020

Вам нужно сделать свой m_iBeepMode atomi c так, чтобы он проверялся на каждой итерации. В его нынешнем виде, поскольку компилятор видит, что ничего в этой функции не изменяет m_iBeepMode, условие вполне может быть полностью удалено. 1006 * раствор.

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