//---------------------------------------------------- // flag2-eb.cc: flag2 + exponential backoff //---------------------------------------------------- #include #include #include //---------------------------------------------------- using namespace std::literals; //---------------------------------------------------- const size_t N = 8; //---------------------------------------------------- class cerrojo { public: void adquirir() { auto delay = 25us; while (cerrado.test() || cerrado.test_and_set()) std::this_thread::sleep_for(delay *= 2); } void liberar() { cerrado.clear(); } private: std::atomic_flag cerrado; } c; //---------------------------------------------------- void seccion_critica() { std::cout << "[" << std::this_thread::get_id() << "]: "; for (size_t i = 0; i < 10; ++i) std::cout << i; std::cout << std::endl; } //---------------------------------------------------- void hebra() { while (true) { c.adquirir(); seccion_critica(); c.liberar(); } } //---------------------------------------------------- int main() { std::jthread threads[N]; for (auto &i : threads) i = std::jthread(hebra); } //----------------------------------------------------