Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

470
Vistas
MongoDB C++: ¿Mongocxx::pool thread es seguro?

¿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"); });
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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 .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda