//----------------------------------------------------- // rwlock.cc: cerrojo de lectura/escritura de pthread //----------------------------------------------------- #include #include #include #include #include #include //----------------------------------------------------- using namespace std::literals; //----------------------------------------------------- const size_t N = 24; // nĂºmero de hebras //----------------------------------------------------- std::latch latch(N); pthread_rwlock_t rwlock; // cerrojo de lectura/escritura //----------------------------------------------------- void seccion_critica(char c) { for (char i = 0; i < 10; ++i) std::cout << c; std::cout << '\n'; } //----------------------------------------------------- void lector(char c) { latch.arrive_and_wait(); while (true) { pthread_rwlock_rdlock(&rwlock); seccion_critica(c); pthread_rwlock_unlock(&rwlock); } } //----------------------------------------------------- void escritor(char c) { latch.arrive_and_wait(); while (true) { pthread_rwlock_wrlock(&rwlock); seccion_critica(c); pthread_rwlock_unlock(&rwlock); } } //----------------------------------------------------- int main() { pthread_rwlock_init(&rwlock, NULL); for (size_t i = 0; i < N / 2; ++i) { std::thread(lector, '0' + i).detach(); std::thread(escritor, 'a' + i).detach(); } std::this_thread::sleep_for(12ms); } //-----------------------------------------------------