#include <condition_variable>
std::condition_variable cv;
bool scrittura_in_corso = false;
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !scrittura_in_corso; });
std::cout << "Lettore " << id << " sta leggendo." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !scrittura_in_corso && lettori == 0; });
scrittura_in_corso = true;
std::cout << "Scrittore " << id << " sta scrivendo." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
scrittura_in_corso = false;
std::thread lettori[3], scrittori[2];
for (int i = 0; i < 3; ++i) {
lettori[i] = std::thread(lettore, i+1);
for (int i = 0; i < 2; ++i) {
scrittori[i] = std::thread(scrittore, i+1);
for (int i = 0; i < 3; ++i) {
for (int i = 0; i < 2; ++i) {
<summary class="cursor-pointer">Utilizzare una condition variable per sincronizzare l'accesso a un contatore condiviso tra più thread.</summary>
#include <condition_variable>
std::condition_variable cv;
void incrementa(int id) {
for (int i = 0; i < 5; ++i) {
std::unique_lock<std::mutex> lock(mtx);
std::cout << "Thread " << id << " incrementa a " << contatore << std::endl;
cv.wait(lock, []{ return contatore % 5 == 0; });
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return contatore % 5 == 0 && contatore > 0; });
std::cout << "Contatore raggiunge multiplo di 5: " << contatore << std::endl;
if (contatore >= 20) break;
std::thread t1(incrementa, 1);
std::thread t2(incrementa, 2);