Is std::list thread safe? I'm assuming its not so I added my own synchronization mechanisms (I think i have the right term). But I am still running into problems
Each function is called by a separate thread. Thread1 can not wait, it has to be as fast as possible
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();
}
}
After about 170k calls to thread1 and 900k calls to thread2 I get an exception error on CFoo& pFoo = g_buffer.front() ;
That causes the program to crash. stdthrow.cpp: 22
#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
Suggestions, comments, is there a better way of doing things?
Is std::list thread safe?
The current C++ standard doesn't even acknowledge the existence of threads, so std::list
certainly isn't. Different implementations, however, might provide (different levels of) thread safety.
As for your code: If you need a lock, use a lock. That bool
variable might not help when the threads are executed on different cores which fetch it from different caches. Use a real mutex instead.
No, it's not guaranteed to be thread safe.
Your synchronization mechanism is flawed. You are allowing thread1
to change the list while thread2
is working with it. This can cause problems. Besides that, you should make your lock variable volatile
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With