БлогNot. C++: запуск потоков по очереди

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 просмотра]


теги: c++ random алгоритм время

К этой статье пока нет комментариев, Ваш будет первым