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
courses:high_performance_computing:producer_consumer [2024/03/04 01:55] odoronincourses:high_performance_computing:producer_consumer [2025/04/27 06:51] (current) kel
Line 16: Line 16:
     - В качестве возвращаемого значения поток должен вернуть свою частичную посчитанную сумму     - В качестве возвращаемого значения поток должен вернуть свою частичную посчитанную сумму
   * Задача потока-interruptor проста: пока происходит процесс обновления значений, он должен постоянно пытаться остановить случайный поток consumer (вычисление случайного потока происходит перед каждой попыткой остановки). Как только поток producer произвел последнее обновление, этот поток завершается. В этом потоке можно выполнять вспомогательные действия которые помогут корректно обработать сигнал   * Задача потока-interruptor проста: пока происходит процесс обновления значений, он должен постоянно пытаться остановить случайный поток consumer (вычисление случайного потока происходит перед каждой попыткой остановки). Как только поток producer произвел последнее обновление, этот поток завершается. В этом потоке можно выполнять вспомогательные действия которые помогут корректно обработать сигнал
 +  * Функция run_threads должна запускать все потоки, дожидаться их выполнения, и возвращать результат общего суммирования
   * Завершение приложения происходит или при считывании перевода каретки из файла или по посылке сигнала SIGTERM, обработку которого нужно также добавить. В обработчике сигнала можно вызывать только signal-safe функции https://man7.org/linux/man-pages/man7/signal-safety.7.html В случае, если в этот момент поток, читающий данные с файла, находится в режиме блокирующего чтения, - он также должен корректно завершиться. Полезно присмотреться к [[https://en.cppreference.com/w/cpp/utility/program/sig_atomic_t|std::sig_atomic_t]] - позволяет потокобезопасно и signal-safe обращаться к переменной такого типа.   * Завершение приложения происходит или при считывании перевода каретки из файла или по посылке сигнала SIGTERM, обработку которого нужно также добавить. В обработчике сигнала можно вызывать только signal-safe функции https://man7.org/linux/man-pages/man7/signal-safety.7.html В случае, если в этот момент поток, читающий данные с файла, находится в режиме блокирующего чтения, - он также должен корректно завершиться. Полезно присмотреться к [[https://en.cppreference.com/w/cpp/utility/program/sig_atomic_t|std::sig_atomic_t]] - позволяет потокобезопасно и signal-safe обращаться к переменной такого типа.
-  * В нашем producer/consumer необходимо реализоваться потоковую обрботку данных для этих целей запрещается загружать весь файл в ОЗУ, иначе на больших файлах обработка не будет помещаться в ограничения ОЗУ на вычислительном устройстве. +  * При сигнале в качестве вывода нужно выдавать посчитанную на этот момент сумму 
-Функция run_threads должна запускать все потоки, дожидаться их выполнения, и возвращать результат общего суммирования. + 
 +Нефункциональные требования: 
 +  - В нашем producer/consumer необходимо реализоваться потоковую обработку данных для этих целей запрещается загружать весь файл в ОЗУ, иначе на больших файлах обработка не будет помещаться в ограничения ОЗУ на вычислительном устройстве. 
 +  - При отсутствии входных данных ядра процессора не должны вхолостую есть такты
  
 Для обеспечения межпоточного взаимодействия допускается использование только pthread API. На вход приложения передаётся 2 аргумента при старте именно в такой последовательности: Для обеспечения межпоточного взаимодействия допускается использование только pthread API. На вход приложения передаётся 2 аргумента при старте именно в такой последовательности:
Line 34: Line 38:
 void* producer_routine(void* arg) { void* producer_routine(void* arg) {
   // Wait for consumer to start.    // Wait for consumer to start. 
-  // You can use this waiting only for debugging your code +  // You should use this waiting only for debugging your code 
-  // For final solution please remove this waiting+  // 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   // Read data, loop through each value and update the value, notify consumer, wait for consumer to process
Line 44: Line 48:
 void* consumer_routine(void* arg) { void* consumer_routine(void* arg) {
   // notify about start   // notify about start
-  // you can use this notification only for debugging your code +  // you should use this notification only for debugging your code 
-  // for final solution please remove this notification+  // for the final solution please remove this notification
      
      
Line 54: Line 58:
 void* consumer_interruptor_routine(void* arg) { void* consumer_interruptor_routine(void* arg) {
   // wait for consumers to start   // wait for consumers to start
-  // you can use this waiting only for debugging your code +  // you should use this waiting only for debugging your code 
-  // for final solution please remove this waiting+  // for the final solution please remove this waiting
  
   // interrupt random consumer while producer is running                                             // interrupt random consumer while producer is running                                          
courses/high_performance_computing/producer_consumer.1709506546.txt.gz · Last modified: 2024/03/04 01:55 by odoronin