courses:high_performance_computing:producer_consumer
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
courses:high_performance_computing:producer_consumer [2017/03/28 08:41] – created kel | courses:high_performance_computing:producer_consumer [2018/10/07 15:58] – kel | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Использование pthread API ====== | ====== Использование pthread API ====== | ||
Ваша задача - реализовать классический паттерн producer-consumer с небольшими дополнительными условиями. | Ваша задача - реализовать классический паттерн producer-consumer с небольшими дополнительными условиями. | ||
- | Программа должна состоять из четырех | + | Программа должна состоять из 3+N потоков: |
- | * Задача producer-потока - получить на вход список чисел, и по очереди использовать каждое значение из этого списка для обновления переменной разделяемой между потоками. После этого поток должен дождаться реакции consumer-потока, и продолжить обновление значений только после того как поток-consumer принял это изменение. Функция исполняющая код этого потока producer_routine должна принимать указатель на объект типа Value, и использовать его для обновления. | + | |
- | * Задача consumer-потока отреагировать на каждое изменение переменной data и набирать сумму полученных значений. После того как достигнуто последнее обновление, | + | - producer |
- | * Задача потока-interruptor проста: | + | - interruptor |
+ | - N потоков consumer | ||
+ | На стандартный ввод программе подается строка - список чисел, разделённых | ||
+ | * Задача producer-потока - получить на вход список чисел, и по очереди использовать каждое значение из этого списка для обновления переменной разделяемой между потоками. После этого поток должен дождаться реакции | ||
+ | * Задача consumer-потоков отреагировать на каждое изменение переменной data и набирать сумму полученных значений. После того как достигнуто последнее обновление, | ||
+ | * Задача потока-interruptor проста: | ||
- | Функция run_threads должна запускать все | + | Функция run_threads должна запускать все потоки, дожидаться их выполнения, |
Для обновления и получения значения следует использовать подготовленный класс Value. Следует создать один экземпляр Value, передать его аргументом в функции producer_routine и consumer_routine. Чтобы обновить значение, | Для обновления и получения значения следует использовать подготовленный класс Value. Следует создать один экземпляр Value, передать его аргументом в функции producer_routine и consumer_routine. Чтобы обновить значение, | ||
- | Для обеспечения межпоточного взаимодействия допускается использование только pthread API. | + | Для обеспечения межпоточного взаимодействия допускается использование только pthread API. На вход приложения передаётся 2 аргумента при старте именно в такой последовательности: |
+ | - Число потоков consumer | ||
+ | - Верхний предел сна consumer в миллисекундах | ||
<file cpp> | <file cpp> | ||
Line 40: | Line 47: | ||
void* consumer_routine(void* arg) { | void* consumer_routine(void* arg) { | ||
// notify about start | // notify about start | ||
- | // allocate value for result | ||
// 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 | + | // return pointer to result |
} | } | ||
Line 52: | Line 58: | ||
int run_threads() { | int run_threads() { | ||
- | // start 3 threads and wait until they' | + | // start N threads and wait until they' |
- | // return sum of update | + | // return |
return 0; | return 0; |
courses/high_performance_computing/producer_consumer.txt · Last modified: 2024/03/04 02:19 by odoronin