Мне нужна ваша помощь с проблемой случайного зависания, с которой мы сталкиваемся в нашем настольном приложении.
У нас есть поток, реализованный в одноэлементном классе для вызова 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 );
}