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 revision Previous revision
courses:high_performance_computing:producer_consumer [2018/10/07 15:58]
kel
courses:high_performance_computing:producer_consumer [2019/02/27 06:58] (current)
kel
Line 7: Line 7:
   - N потоков consumer   - N потоков consumer
 На стандартный ввод программе подается строка - список чисел, разделённых пробелом. Длина списка чисел не задаётся - считывание происходит до перевода каретки. На стандартный ввод программе подается строка - список чисел, разделённых пробелом. Длина списка чисел не задаётся - считывание происходит до перевода каретки.
-  * Задача producer-потока - получить на вход список чисел, и по очереди использовать каждое значение из этого списка для обновления переменной разделяемой между потоками. После этого поток должен дождаться реакции одного из consumer-потоков,​ и продолжить обновление значений только после того как поток-consumer принял это изменение. Функция исполняющая код этого потока producer_routine должна принимать указатель на объект типа Value, и использовать его для обновления. +  * Задача producer-потока - получить на вход список чисел, и по очереди использовать каждое значение из этого списка для обновления переменной разделяемой между потоками 
-  * Задача consumer-потоков отреагировать на каждое изменение ​переменной data и набирать сумму полученных значений. После того как достигнуто последнее обновление,​ функция потока должна вернуть результирующую сумму. Также этот поток должен защититься от попыток потока-interruptor его остановить. Функция исполняющая код этого потока consumer_routine должна принимать указатель на тот же объект ​типа Value, и читать ​из него ​обновленияПосле суммирования переменной поток должен заснуть на случайное количество миллисекунд,​ верхний предел будет передан на вход приложения. Вовремя сна поток не должен мешать другим потокам consumer выполнять свои задачи,​ если они есть+  * Задача consumer-потоков отреагировать на уведомление от producer ​и набирать сумму полученных значений. Также этот поток должен защититься от попыток потока-interruptor его остановить. ​Дополнительные условия:​ 
 +    - Функцияисполняющая код этого потока consumer_routineдолжна принимать указатель на объект/переменную, из которого будет ​читать обновления 
 +    - После суммирования переменной поток должен заснуть на случайное количество миллисекунд,​ верхний предел будет передан на вход приложения ​(0 миллисекунд также должно корректно обрабатываться). Вовремя сна поток не должен мешать другим потокам consumer выполнять свои задачи,​ если они есть 
 +    - Потоки consumer не должны дублировать вычисления друг с другом одних и тех же значений 
 +    - В качестве возвращаемого значения поток должен вернуть свою частичную посчитанную сумму 
 +    - Хранить промежуточные значения своей суммы поток должен в TLS-переменной,​ объявленной за границами области видимости функции
   * Задача потока-interruptor проста:​ пока происходит процесс обновления значений,​ он должен постоянно пытаться остановить случайный поток consumer (вычисление случайного потока происходит перед каждой попыткой остановки). Как только поток producer произвел последнее обновление,​ этот поток завершается.   * Задача потока-interruptor проста:​ пока происходит процесс обновления значений,​ он должен постоянно пытаться остановить случайный поток consumer (вычисление случайного потока происходит перед каждой попыткой остановки). Как только поток producer произвел последнее обновление,​ этот поток завершается.
  
-Функция run_threads должна запускать все потоки,​ дожидаться их выполнения,​ и возвращать результат ​потока-consumer (одного из, так как у всех они ​будут одинаковы).  +Функция run_threads должна запускать все потоки,​ дожидаться их выполнения,​ и возвращать результат общего суммирования. 
- +
-Для обновления и получения значения следует использовать подготовленный класс Value. Следует создать один экземпляр Value, передать его аргументом в функции producer_routine и consumer_routine. Чтобы обновить значение, следует использовать метод update, чтобы получить - get+
  
 Для обеспечения межпоточного взаимодействия допускается использование только pthread API. На вход приложения передаётся 2 аргумента при старте именно в такой последовательности:​ Для обеспечения межпоточного взаимодействия допускается использование только pthread API. На вход приложения передаётся 2 аргумента при старте именно в такой последовательности:​
   - Число потоков consumer   - Число потоков consumer
   - Верхний предел сна consumer в миллисекундах   - Верхний предел сна consumer в миллисекундах
 +
 +В поток вывода должно попадать только результирующее значение,​ по умолчанию никакой отладочной или запросной информации выводиться не должно.
  
 <file cpp> <file cpp>
 #include <​pthread.h>​ #include <​pthread.h>​
- 
-class Value { 
-public: 
-    Value() : _value(0) { } 
- 
-    void update(int value) { 
-        _value = value; 
-    } 
- 
-    int get() const { 
-        return _value; 
-    } 
- 
-private: 
-    int _value; 
-}; 
  
 void* producer_routine(void* arg) { void* producer_routine(void* arg) {
Line 42: Line 31:
  
   // Read data, loop through each value and update the value, notify consumer, wait for consumer to process   // Read data, loop through each value and update the value, notify consumer, wait for consumer to process
- 
 } }
  
Line 48: Line 36:
   // notify about start   // notify about start
   // for every update issued by producer, read the value and add to sum   // for every update issued by producer, read the value and add to sum
-  // return pointer to result (aggregated result ​for all consumers)+  // return pointer to result (for particular consumer)
 } }
  
 void* consumer_interruptor_routine(void* arg) { void* consumer_interruptor_routine(void* arg) {
-  // wait for consumer ​to start+  // wait for consumers ​to start
  
-  // interrupt consumer while producer is running ​                                         ​+  // interrupt ​random ​consumer while producer is running ​                                         ​
 } }
  
courses/high_performance_computing/producer_consumer.txt · Last modified: 2019/02/27 06:58 by kel