std :: map和线程安全的奇怪问题

时间:2011-03-07 10:54:42

标签: c++ multithreading stl

现在这不是一个问题,因为我已经实现了我自己的收藏,但仍然对此有点好奇。

我有一个提供对各种常见组件的访问的单例,它保存带有线程ID的这些组件的实例,因此每个线程都应该(并且我检查过)拥有它自己的组件实例,例如Oracle数据库访问库。

当运行具有多个传入请求的系统(由C#应用程序调用的C ++库)时,一切似乎运行良好一段时间但随后它会因 AccessViolation 异常而崩溃。单步执行调试器时,问题似乎是当一个线程完成并清除它的会话信息(保存在std :: map对象中)时,另一个线程的单独集合实例中保存的会话信息似乎也被清除。 / p>

这是否是其他人遇到或了解的事情?我试过看看但却找不到任何关于这类问题的事情。

干杯

3 个答案:

答案 0 :(得分:2)

标准C ++容器并不关心线程安全性。您的代码听起来像是从两个不同的线程修改映射实例,或者在一个线程中修改映射并在另一个线程中读取它。这显然是错误的。使用一些锁定原语来同步线程之间的访问。

答案 1 :(得分:1)

如果您想要的是每个线程的单独对象,您可能需要查看boost::thread_specific_ptr

答案 2 :(得分:0)

如何管理为每个线程提供自己的会话信息?在那里的某个地方你有管理这些对象生命周期的类,这就是它出现问题的地方。