Ho raggiunto un punto nel mio progetto che richiede la comunicazione tra thread su risorse a cui può essere scritto molto bene, quindi la sincronizzazione è un must. Tuttavia, in realtà non capisco la sincronizzazione con qualcosa di diverso dal livello base.std: esempio lock_guard, spiegazione del motivo per cui funziona
consideri l'ultimo esempio in questo link: http://www.bogotobogo.com/cplusplus/C11/7_C11_Thread_Sharing_Memory.php
#include <iostream>
#include <thread>
#include <list>
#include <algorithm>
#include <mutex>
using namespace std;
// a global variable
std::list<int>myList;
// a global instance of std::mutex to protect global variable
std::mutex myMutex;
void addToList(int max, int interval)
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (int i = 0; i < max; i++) {
if((i % interval) == 0) myList.push_back(i);
}
}
void printList()
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (auto itr = myList.begin(), end_itr = myList.end(); itr != end_itr; ++itr) {
cout << *itr << ",";
}
}
int main()
{
int max = 100;
std::thread t1(addToList, max, 1);
std::thread t2(addToList, max, 10);
std::thread t3(printList);
t1.join();
t2.join();
t3.join();
return 0;
}
L'esempio dimostra come tre fili, due scrittori e un lettore, accede a una risorsa comune (lista).
Vengono utilizzate due funzioni globali: una utilizzata dai due thread di writer e una utilizzata dal thread di lettura. Entrambe le funzioni utilizzano un lock_guard per bloccare la stessa risorsa, la lista.
Ora ecco cosa non riesco a comprendere: il lettore utilizza un blocco in un ambito diverso rispetto ai due thread di writer, ma blocca ancora la stessa risorsa. Come può funzionare? La mia comprensione limitata dei mutex si presta bene alla funzione di scrittura, ci sono due thread che usano la stessa identica funzione. Posso capire che un controllo viene effettuato mentre stai per entrare nell'area protetta, e se qualcun altro è già dentro, aspetti.
Ma quando l'ambito è diverso? Ciò indicherebbe che esiste un meccanismo più potente del processo stesso, una sorta di ambiente di runtime che blocca l'esecuzione del thread "tardivo". Ma pensavo che non ci fossero cose del genere in C++. Quindi sono in perdita.
Cosa succede esattamente sotto il cofano qui?
Vorrei aggiungere che il blocco mutex è [atomico] (http://stackoverflow.com/questions/15054086/what-does-atomic-mean-in-programming). Spero che questo ti aiuti. – Incomputable