gpt4 book ai didi

c++ - 线程安全地构造 C++ 对象(MFC CRecordset)

转载 作者:行者123 更新时间:2023-11-30 03:12:06 24 4
gpt4 key购买 nike

我们正在尝试构建一个提供 MFC 的类 CRecordset (或者,实际上是 CODBCRecordset 类)线程安全。对于各种功能,例如打开和移动记录集(我们将这些调用包含在关键部分中),一切似乎都运行得很好,但是,仍然存在一个问题,这个问题似乎在实践中引入了死锁。

问题似乎出在我们的构造函数上,像这样:

CThreadSafeRecordset::CThreadSafeRecordset(void) : CODBCRecordset(g_db)
{ // <-- Deadlock!
}

另一个线程可能是一个已经在 CThreadSafeRecordset::Close() 中结束的线程,尽管我们保护了封闭的 Close 调用,但这并不重要,因为构造函数线程不知道。我假设原来的 CRecordset 类是罪魁祸首,在构建时做坏事。我四处寻找编程技术来解决这个问题,但我不确定什么是最好的解决方案?由于我们没有代码并且无法控制构造函数中的其他代码,所以我们不能在关键部分包装任何特殊的东西......?

更新:感谢您的投入;我已将最终结果标记为问题的答案。结合返回 shared_ptr作为返回的实例,以便于更新现有的线程未知代码。

最佳答案

您可以将 CThreadSafeRecordset 构造函数设为私有(private),然后提供参与锁定并返回实例的公共(public)工厂方法。

关于c++ - 线程安全地构造 C++ 对象(MFC CRecordset),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1526053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com