Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

457
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!