//---------------------------------------------------- // tas.cc --> https://www.felixcloutier.com/x86/pause //---------------------------------------------------- #include #include #include #include //---------------------------------------------------- using namespace std::literals; //---------------------------------------------------- const size_t N = 32; std::latch latch(N); std::atomic stop = false; //---------------------------------------------------- template T test_and_set(volatile T *spinlock) { T ret = true; __asm__ __volatile__("pause; xchg %0, %1" : "+r"(ret), "+m"(*spinlock)); return ret; } //---------------------------------------------------- class cerrojo { public: void adquirir() { while (test_and_set(&cerrado)); } void liberar() { cerrado = false; } private: volatile bool cerrado = false; } c; //---------------------------------------------------- void seccion_critica() { std::cout << "[" << std::this_thread::get_id() << "]: "; for (size_t i = 0; i < 10; ++i) std::cout << i; std::cout << '\n'; } //---------------------------------------------------- void hebra() { latch.arrive_and_wait(); while (!stop) { c.adquirir(); if (!stop) seccion_critica(); c.liberar(); } } //---------------------------------------------------- int main() { std::jthread threads[N]; for (auto &i: threads) i = std::jthread(hebra); std::this_thread::sleep_for(75ms); stop = true; } //----------------------------------------------------