关于Mongo C ++驱动程序的线程安全性,这个问题是对this one的一种跟进。作为参考,我正在使用驱动程序的legacy-1.0.2 version。
因此,在阅读了该问题的答案之后,很明显两个线程同时使用相同的DBClientConnection
是不安全的。但是,由于游标的“间接”使用连接呢?我们用一个例子来解释一下。
考虑具有连接池的程序(即DBClientConnection
个对象的数组)以及确保一次只有一个线程使用池的给定实例的方法。让我们考虑以下情况:
query()
操作并获取DBClientCursor
对象(让我们将其命名为U1)。需要说明的是,我指的是this particular operation。while(u1->more())
循环中处理U1的结果。假设光标太大,以至于并非所有结果都可以在第一组中返回(在布线协议级别),因此需要连接到DB以通过驱动程序实现的网络布线协议返回新结果。 / LI>
这种情况会有问题吗?虽然,该程序正在遵守关于DBClientConnection
对象的线程安全性“合同”(即,一次只能有一个线程可以访问同一个DBClientConnection
实例)和DBClientCursor
(即只有一个线程)一次可以访问相同的DBClientCursor
实例),由于游标可能会间接并发访问同一连接(在内部级别),我不知道这是否是一个问题。
这个问题的基本原理:我有一个程序可能会出现上述情况,并且由于DBClientCursor
方法的异常而导致奇怪和半随机崩溃,特别是next()/nextSafe()
和more()
。 more()
的情况特别奇怪......这是一个非常简单的方法,不应该失败(当然除了并发问题)
答案 0 :(得分:2)
执行您的建议是不合法的:在内部,DBClientCursor包含指向DBClientBase对象的指针,并在其上调用方法。因此,您必须将连接保留在池中,直到销毁光标为止。