#include #include #include #include #include #include #include using namespace std; int state = 0; condition_variable cv; mutex cv_mtx; double read_sensor(int id) { static thread_local std::mt19937 generator(id); std::uniform_int_distribution sleep_distribution(100, (id + 1) * 1000); std::uniform_real_distribution value_distribution(id, id + 0.99); std::this_thread::sleep_for(std::chrono::milliseconds(sleep_distribution(generator))); return value_distribution(generator); } int main() { vector threads_vec; queue> sensorsData; int numberOfSensors; cin >> numberOfSensors; unique_lock lock(cv_mtx); for (int i = 0; i < numberOfSensors; i++) { thread tmp([&sensorsData , i]() { while (1) { unique_lock lock(cv_mtx); sensorsData.push(read_sensor(i)); cout << "sensor state" << state << endl; cout.flush(); state++; cv.notify_all(); } }); threads_vec.push_back(move(tmp)); } while (state != 5) { cout << "New data!: "; cv.wait(lock); cout << sensorsData.front() << endl; sensorsData.pop(); } state = 0; for (auto &t : threads_vec) { t.join(); } system("pause"); return 0; }