C++: запуск потоков по очереди
По условию, мы "вручную" запускаем первый поток, а все остальные n-1
потоков, к этому моменту уже созданных, выводят в консоль рандомное число от 2
до n
, засыпают на соответствующее количество секунд и затем передают эстафету следующему потоку, делающему то же самое.
Зачем это может быть нужно - вопрос отдельный, и к теме исследования отношения не имеет :)
Программка проверялась в консоли актуальной сборки Visual Studio 2019.
#include <cstdlib> #include <iostream> #include <string> #include <vector> #include <thread> #include <mutex> #include <ctime> static std::vector<std::thread> threads; std::mutex starter; //Стартер void worker(int n, int index, int sleep) { if (index > 0) { //Если мы не первый поток, то ждём предыдущий threads[index - 1].join(); } else { starter.lock(); //Иначе ждем старта starter.unlock(); } std::cout << "Thread " << std::to_string(index) << " will sleep " << std::to_string(sleep) << " :"; for (int i = 0; i < sleep; i++) { std::cout << "."; std::this_thread::sleep_for(std::chrono::seconds(1)); } std::cout << std::endl; } int main () { const int n = 5; //Количество потоков srand(time(NULL)); //Инициализируем генератор СЧ int sleep = 2 + rand() % (n - 1); //Случайное число получаем в этом же процессе std::cout << std::unitbuf; starter.lock(); // Блокируем запуск for (int i = 0; i < n; i++) { threads.push_back(std::thread(&worker, n, i, sleep)); } std::cout << "OK. Press Enter to start" << std::endl; std::cin.get(); starter.unlock(); //Разрешаем запуск threads.back().join(); //Ждём окончания работы последнего потока return 0; }
01.02.2023, 22:47 [234 просмотра]