我正在创建一个线程池,它可以使用缓冲区并对我的应用程序执行某些操作。我创建了一个std :: list m_buffer,有时应用程序在缓冲区的末尾崩溃。 这是我的代码:
MyObject* myObject = 0; bool hasMore = true; while(hasMore) { { boost::unique_lock lck(m_loadMutex1); if(!m_buffer.size()) break; myObject = m_buffer.front(); m_buffer.pop_front(); hasMore = m_buffer.size(); } } if(myObject) loadMyObject(myObject);
我确定列表永远不会空着。许多线程同时执行这段代码。在Windows上进行测试有时应用程序崩溃,调试器说它在pop_front上。但我无法相信它,因为我检查尺寸是否大于0.
感谢您的帮助。
答案 0 :(得分:0)
在调试器中设置第一次机会异常,看看抛出的异常是什么。
答案 1 :(得分:0)
我看不到发布的代码会包含这样的问题的方法。
很可能在某个地方ELSE你要从列表中添加或删除,不受保护,同时弹出此功能。
或者可能存在随机内存损坏。 pop_front
失败时检查调试器中缓冲区的大小。
答案 2 :(得分:0)
我会检查程序是如何终止的。也许该名单已被解除分配。如果方式可能会发生这种情况。例如:列表在主线程上创建,主线程完成并释放列表,其他线程仍在使用列表。我提到了这个特殊的例子,因为我在上面的线程方法中没有看到任何逻辑让每个线程都知道它是'关闭'时间。