Безопасен ли поток std :: list? Я предполагаю, что это не так, я добавил свои собственные механизмы синхронизации (я думаю, что у меня есть правильный термин). Но я все еще сталкиваюсь с проблемами
Каждая функция вызывается отдельным потоком. Thread1 не может ждать, это должно быть как можно быстрее
std::list<CFoo> g_buffer;
bool g_buffer_lock;
void thread1( CFoo frame ) {
g_buffer_lock = true ;
g_buffer.push_back( frame ) ;
g_buffer_lock = false;
}
void thread2( )
{
while( g_buffer_lock ) {
// Wait
}
// CMSTP_Send_Frame * pMSTPFrame = NULL ;
while ( ! g_buffer_lock && g_buffer.size() > 0 )
{
// Get the top item
CFoo& pFoo = g_buffer.front() ;
// Do something.
// remove the front item
g_buffer.pop_front();
}
}
После примерно 170 тыс. Звонков в thread1 и 900 тыс. Звонков в thread2 я получаю сообщение об ошибке исключения CFoo& pFoo = g_buffer.front() ;
Это вызывает сбой программы. stdthrow.cpp: 22 * 1009 *
#ifdef _DEBUG
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line)
{ // report error and die
if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1)
{
::_CrtDbgBreak();
}
}
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const unsigned short *message, const unsigned short *file, unsigned int line)
{ // report error and die
_Debug_message((wchar_t *) message, (wchar_t *) file, line);
}
#endif
Предложения, комментарии, есть ли лучший способ сделать что-то?