【发布时间】:2009-10-06 14:48:13
【问题描述】:
我们正在尝试构建一个提供 MFC CRecordset(或者,实际上是 CODBCRecordset 类)线程安全的类。对于各种功能,例如打开和移动记录集(我们将这些调用与关键部分括起来),实际上一切似乎都很好,但是,仍然存在一个问题,这个问题似乎在实践中引入了死锁。
问题似乎出在我们的构造函数上,像这样:
CThreadSafeRecordset::CThreadSafeRecordset(void) : CODBCRecordset(g_db)
{ // <-- Deadlock!
}
尽管我们保护了封闭的 Close 调用,但另一个线程可能最终在 CThreadSafeRecordset::Close() 中结束,但这并不重要,因为构造函数不知道线程。我认为最初的 CRecordset 类是罪魁祸首,在施工时做坏事。我一直在寻找解决这个问题的编程技术,但我不确定什么是最好的解决方案?由于我们没有代码,也无法控制构造函数中的其他代码,所以我们不能在临界区中包装任何特殊的东西......?
更新:感谢您的意见;我已经将我最终得到的内容标记为我的问题的答案。这与返回 shared_ptr 作为返回实例相结合,以便于更新现有的线程不感知代码。
【问题讨论】:
标签: c++ multithreading mfc thread-safety recordset