Posix threads

GitHub-classroom для самостоятельно изучающих курс не в рамках университетских программ

Ваша задача - реализовать классический паттерн producer-consumer с небольшими дополнительными условиями. Программа должна состоять из 3+N потоков:

  1. Главный
  2. producer
  3. interruptor
  4. N потоков consumer

В файл, чтение которого уже реализовано в шаблоне кода в блокирующкем режиме, пишется список чисел, разделённых пробелом (читать можно до переноса строки). Длина списка чисел не задаётся - считывание происходит до перевода каретки.

Функция run_threads должна запускать все потоки, дожидаться их выполнения, и возвращать результат общего суммирования.

Для обеспечения межпоточного взаимодействия допускается использование только pthread API. На вход приложения передаётся 2 аргумента при старте именно в такой последовательности:

  1. Число потоков consumer
  2. Верхний предел сна consumer в миллисекундах

В поток вывода должно попадать только результирующее значение, по умолчанию никакой отладочной или запросной информации выводиться не должно. В случае детектирования ошибок нужно выдавать не нулевой код возврата.

#include <iostream>
#include <fstream>
#include <pthread.h>
 
void* producer_routine(void* arg) {
  // Wait for consumer to start. 
  // You should use this waiting only for debugging your code
  // For the final solution please remove this waiting
 
  // Read data, loop through each value and update the value, notify consumer, wait for consumer to process
  std::ifstream ifs("in.txt");
  // ...
}
 
void* consumer_routine(void* arg) {
  // notify about start
  // you should use this notification only for debugging your code
  // for the final solution please remove this notification
 
 
  // for every update issued by producer, read the value and add to sum
  // return pointer to result (for particular consumer)
}
 
void* consumer_interruptor_routine(void* arg) {
  // wait for consumers to start
  // you should use this waiting only for debugging your code
  // for the final solution please remove this waiting
 
  // interrupt random consumer while producer is running                                          
}
 
int run_threads() {
  // start N threads and wait until they're done
  // return aggregated sum of values
 
  return 0;
}
 
int main() {
    std::cout << run_threads() << std::endl;
    return 0;
}