//--------------------------------------------------------- // monitor.cc //--------------------------------------------------------- #include #include #include #include #include #include //--------------------------------------------------------- using namespace std::literals; //--------------------------------------------------------- const size_t N = std::thread::hardware_concurrency(); //--------------------------------------------------------- class barrera_t { public: barrera_t(size_t m): cicle(0), counter(m), max(m) {} void esperar() { std::unique_lock lock(mutex); std::size_t now = cicle; if (--counter) { cv.wait(lock, [&] { return cicle != now; }); } else { counter = max; ++cicle; cv.notify_all(); } } private: std::mutex mutex; std::condition_variable cv; std::size_t cicle, counter, max; } barrera(N); //--------------------------------------------------------- void hebra(size_t yo) { std::string antes = std::to_string(yo) + ": antes\n", despues = std::to_string(yo) + ": después\n"; while (true) { std::osyncstream(std::cout) << antes; barrera.esperar(); std::osyncstream(std::cout) << despues; } } //--------------------------------------------------------- int main() { for (size_t i = 0; i < N; ++i) std::thread(hebra, i).detach(); std::this_thread::sleep_for(25ms); std::osyncstream(std::cout) << std::flush; } //---------------------------------------------------------