¿Tengo que bloquear manualmente mongocxx::pool mientras obtengo una conexión?
es decir, ¿es esto seguro? (ejemplo copiado del sitio web de Mongo)
mongocxx::instance instance{}; mongocxx::pool pool {mongocxx::uri{}}; using mongocxx::pool::entry = std::unique_ptr<client, std::function<void (client*)>> auto threadfunc = [](mongocxx::client &client, stdx::string_view dbname) { client[dbname]["col"].insert({}); } // don't even bother sharing clients. Just give each thread its own, std::thread([]() { // pool.acquire() returns a mongo::pool::entry type mongocxx::client *c= pool.acquire().get(); threadfunc(*c, "db1"); threadfunc(*c, "db2"); }); std::thread([]() { mongocxx::client *c = pool.acquire().get();; threadfunc(*c, "db2"); threadfunc(*c, "db1"); });Sí, mongocxx::pool es seguro para subprocesos. Puede acceder a él simultáneamente desde varios subprocesos. Sin embargo, los objetos mongocxx::client individuales devueltos del grupo no son seguros para subprocesos, ni los objetos subordinados como collection o la base de database se obtienen del client ; no debe compartirlos entre subprocesos.
Tenga en cuenta también que su ejemplo (que no se copia literalmente del sitio web sino que se modifica de uno de los ejemplos), contiene un error de programación grave.
Esta línea:
mongocxx::client *c= pool.acquire().get(); Obtendrá una entrada de grupo, luego extraerá un puntero desnudo de él. Sin embargo, la entrada del grupo se destruirá al final de la declaración, lo que hará que el objeto del client subyacente se devuelva al grupo, lo que permitirá que otro subproceso lo recoja mientras continúa usándolo.
Debes escribir esto como:
mongocxx::instance instance{}; mongocxx::pool pool {mongocxx::uri{}}; auto threadfunc = [](mongocxx::client &client, stdx::string_view dbname) { client[dbname]["col"].insert({}); } // don't even bother sharing clients. Just give each thread its own, std::thread([]() { // pool.acquire() returns a mongo::pool::entry type auto c = pool.acquire(); threadfunc(*c, "db1"); threadfunc(*c, "db2"); }); std::thread([]() { auto c = pool.acquire(); threadfunc(*c, "db2"); threadfunc(*c, "db1"); }); De esa forma, cada subproceso retiene la entrada del grupo hasta que termina de usarla, momento en el que se devolverá automáticamente cuando se destruya el unique_ptr en c .