1

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

Буферный пул в данном случае - динамический массив, если я верно понял преподавателя. По условию задачи поток-читатель и поток-писатель приостанавливаются в ожидании непустого и пустого буфера соответственно.

Каким образом реализовать проверку на наличие пустого-непустого буфера, чтобы активизировались потоки? Каким образом передавать в поток-читатель или в поток-писатель адрес освободившегося буфера для работы с ним?

Основной принцип работы потоков схож с примером на википедии (тут), но можно решить и с 2 семафорами.

gugr
  • 11
  • Вот вам готовая имплементация: https://ru.stackoverflow.com/a/428867/10105. Править её точно под вашу лабу, заменяя condition variable на семафоры, думаю, вряд ли кто-то будет. – VladD Nov 29 '17 at 12:23

0 Answers0