//--------------------------------------------------------- // rwlock.cc // soluciĆ³n de pthread //--------------------------------------------------------- #include #include #include #include #include #include #include //--------------------------------------------------------- using namespace std; //--------------------------------------------------------- atomic run(true); pthread_rwlock_t rwlock; // cerrojo de lectura/escritura //--------------------------------------------------------- void seccion_critica(char c) { for (char i = 0; i < 10; ++i) cout << c; cout << endl; } //--------------------------------------------------------- void lector(char c) { while (run) { auto espera = 16us; while (!pthread_rwlock_tryrdlock(&rwlock)) this_thread::sleep_for(espera *= 2); seccion_critica(c); pthread_rwlock_unlock(&rwlock); } } //--------------------------------------------------------- void escritor(char c) { while (run) { auto espera = 16us; while (!pthread_rwlock_trywrlock(&rwlock)) this_thread::sleep_for(espera *= 2); seccion_critica(c); pthread_rwlock_unlock(&rwlock); } } //--------------------------------------------------------- int main() { const unsigned N = 8; thread lectores[N], escritores[N]; std::default_random_engine engine; pthread_rwlock_init(&rwlock, NULL); for (unsigned i = 0; i < N; ++i) if (engine() & 1) { lectores[i] = thread( lector, '0' + i); escritores[i] = thread(escritor, 'a' + i); } else { escritores[i] = thread(escritor, 'a' + i); lectores[i] = thread( lector, '0' + i); } this_thread::sleep_for(100ms); run = false; for(thread& i: lectores) i.join(); for(thread& i: escritores) i.join(); pthread_rwlock_destroy(&rwlock); } //---------------------------------------------------------