Stavo leggendo attraverso un tutorial Boost Mutex su drdobbs.com, e ho trovato questo pezzo di codice:Boost Mutex con mirino Blocco
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>
boost::mutex io_mutex;
void count(int id)
{
for (int i = 0; i < 10; ++i)
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout << id << ": " <<
i << std::endl;
}
}
int main(int argc, char* argv[])
{
boost::thread thrd1(
boost::bind(&count, 1));
boost::thread thrd2(
boost::bind(&count, 2));
thrd1.join();
thrd2.join();
return 0;
}
Ora capisco il punto di un mutex è quello di evitare che due thread di accedere al stessa risorsa allo stesso tempo, ma non vedo la correlazione tra io_mutex e std :: cout. Questo codice blocca tutto all'interno dell'ambito finché l'ambito non è finito?
Sì, 'scoped_lock' blocca il mutex fino all'uscita dall'ambito. Ha un nome piuttosto intuitivo. – juanchopanza
@juanchopanza Capisco che la parte, scoped_lock ha perfettamente senso. Quello che non capisco è la relazione tra il mutex e qualsiasi altra cosa nel programma. È più legato all'ordine di esecuzione nel programma e meno alla memoria effettiva? Scusate se si tratta di una domanda noob, ma ho cercato di imparare i mutex per la settimana scorsa o poco più e non lo capisco. –
@ jlw2387: Come ho scritto nella mia risposta, 'std :: cout' è un oggetto globale, quindi puoi vederlo come una risorsa condivisa. L'accesso a una risorsa condivisa contemporaneamente da thread diversi richiede la sincronizzazione. Questo è ciò che sta facendo 'scoped_lock ' –