Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


courses:high_performance_computing:producer_consumer

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
courses:high_performance_computing:producer_consumer [2019/07/27 22:56] odoronincourses:high_performance_computing:producer_consumer [2021/10/02 23:46] kel
Line 1: Line 1:
-====== Использование pthread API ======+====== Posix threads ======
 Ваша задача - реализовать классический паттерн producer-consumer с небольшими дополнительными условиями. Ваша задача - реализовать классический паттерн producer-consumer с небольшими дополнительными условиями.
 Программа должна состоять из 3+N потоков:  Программа должна состоять из 3+N потоков: 
Line 6: Line 6:
   - interruptor   - interruptor
   - N потоков consumer   - N потоков consumer
-На стандартный ввод программе подается строка - список чисел, разделённых пробелом. Длина списка чисел не задаётся - считывание происходит до перевода каретки.+В файл, чтение которого уже реализовано в шаблоне кода в блокирующкем режиме, пишется список чисел, разделённых пробелом (читать можно до переноса строки). Длина списка чисел не задаётся - считывание происходит до перевода каретки.
   * Задача producer-потока - получить на вход список чисел, и по очереди использовать каждое значение из этого списка для обновления переменной разделяемой между потоками   * Задача producer-потока - получить на вход список чисел, и по очереди использовать каждое значение из этого списка для обновления переменной разделяемой между потоками
   * Задача consumer-потоков отреагировать на уведомление от producer и набирать сумму полученных значений. Также этот поток должен защититься от попыток потока-interruptor его остановить. Дополнительные условия:   * Задача consumer-потоков отреагировать на уведомление от producer и набирать сумму полученных значений. Также этот поток должен защититься от попыток потока-interruptor его остановить. Дополнительные условия:
Line 14: Line 14:
     - В качестве возвращаемого значения поток должен вернуть свою частичную посчитанную сумму     - В качестве возвращаемого значения поток должен вернуть свою частичную посчитанную сумму
   * Задача потока-interruptor проста: пока происходит процесс обновления значений, он должен постоянно пытаться остановить случайный поток consumer (вычисление случайного потока происходит перед каждой попыткой остановки). Как только поток producer произвел последнее обновление, этот поток завершается.   * Задача потока-interruptor проста: пока происходит процесс обновления значений, он должен постоянно пытаться остановить случайный поток consumer (вычисление случайного потока происходит перед каждой попыткой остановки). Как только поток producer произвел последнее обновление, этот поток завершается.
 +  * Завершение приложения происходит по посылке сигнала SIGTERM, обработку которого нужно также добавить. В случае, если в этот момент поток, читающий данные с файла, находится в режиме блокирующего чтения, - он также должен корректно завершиться.
 Функция run_threads должна запускать все потоки, дожидаться их выполнения, и возвращать результат общего суммирования.  Функция run_threads должна запускать все потоки, дожидаться их выполнения, и возвращать результат общего суммирования. 
  
Line 20: Line 20:
   - Число потоков consumer   - Число потоков consumer
   - Верхний предел сна consumer в миллисекундах   - Верхний предел сна consumer в миллисекундах
 +
 +Так-же необходимо реализовать поддержку ключа --debug, при использовании которого каждый consumer-поток будет выводить пару (thread id, partial summ). Вывод значений psum происходит при каждом изменении.
  
 В поток вывода должно попадать только результирующее значение, по умолчанию никакой отладочной или запросной информации выводиться не должно. В поток вывода должно попадать только результирующее значение, по умолчанию никакой отладочной или запросной информации выводиться не должно.
Line 25: Line 27:
 <file cpp> <file cpp>
 #include <pthread.h> #include <pthread.h>
 +
 +void read_values() {
 +  FILE* file = fopen("in.txt");
 +  ... read();
 +}
  
 void* producer_routine(void* arg) { void* producer_routine(void* arg) {
courses/high_performance_computing/producer_consumer.txt · Last modified: 2024/03/04 02:19 by odoronin