gpt4 book ai didi

c++ - 关于通过游标间接连接使用的 MongoDB C++ 驱动程序的线程安全性

转载 作者:可可西里 更新时间:2023-11-01 10:25:59 24 4
gpt4 key购买 nike

这个问题是this one的一种跟进,关于 Mongo C++ 驱动程序的线程安全性。作为引用,我正在使用 legacy-1.0.2 version司机。

因此,在阅读该问题的答案后,很明显两个线程同时使用相同的 DBClientConnection 是不安全的。但是,由于游标而“间接”使用连接呢?让我用一个例子来解释。

考虑一个带有连接池的程序(即一组 DBClientConnection 对象)和一种确保一次只有一个线程使用池的给定实例的方法。让我们考虑以下情况:

  • 线程 T1 从池中获取连接 C1。从那时起,除了 T1 之外没有人访问 C1。
  • 线程 T1 使用 C1 执行 query() 操作并获取 DBClientCursor 对象(我们将其命名为 U1)。明确地说,我指的是 this particular operation .
  • 线程 T1 将 C1 返回到池中,因为一旦获得 U1 对象,连接对象 itsef 就不再对他有用。
  • T1 开始在一个很长的 while(u1->more()) 循环中处理 U1 的结果。假设游标太大,无法在第一批(在连接协议(protocol)级别)中返回所有结果,因此需要连接到 DB 以通过驱动程序实现的网络连接协议(protocol)返回新结果。
  • 当 T1 执行该工作时,新线程 (T2) 从池中获取 C1,即 T1 之前使用的连接。
  • T2 使用 C1 执行一些操作,而 T1 仍在使用 U1(通过 C1 生成的游标)。

这种情况会不会有问题?虽然,该程序遵守关于 DBClientConnection 对象的线程安全“契约”(即一次只有一个线程可以访问相同的 DBClientConnection 实例)和 DBClientCursor (即一次只有一个线程可以访问同一个 DBClientCursor 实例),由于游标,可能存在对同一连接(在内部级别)的间接并发访问,我不知道不知道这是否会成为问题。

这个问题的基本原理:我有一个程序,其中可能会发生上述情况,并且由于 DBClientCursor 方法出现异常,我遇到了奇怪的半随机崩溃,特别是 next()/nextSafe()more()more() 的情况特别奇怪...这是一个如此简单的方法,应该不会失败(当然,并发问题除外)

最佳答案

按照您的建议行事是不合法的:DBClientCursor 内部包含一个指向 DBClientBase 对象的指针,并调用其上的方法。因此,在销毁游标之前,必须将连接保持在池外。

关于c++ - 关于通过游标间接连接使用的 MongoDB C++ 驱动程序的线程安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33945987/

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