Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

461
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda