CPP_LECTS_RUS Telegram 86
Работа над ошибками (нужна помощь зала).

В комментариях мой уважаемый подписчик Роман Митин указал что я на лекции показал неправильный пример bounded MPMC queue -- на самом деле извлечение и вставка там шли с одного конца и таким образом это был скорее bounded MPMC stack. Для многопоточной среды разница не так велика -- задачи ставятся в "очередь" и разбираются консьюмерами и в общем по циклограмме работы сложно отличить что там было. Но я решил сделать настоящую очередь и заодно улучшить тесты.

И вот тут я обратил внимание что у меня было ещё несколько ошибок, пока в комментариях не замеченных.

(1) В случае multi-producer делать wake_and_done надо на всех продьюсеров один раз иначе бывает так что консьюмеры повыходили но не все продьюсеры ещё закончили.
(2) Саму функцию wait_and_pop надо делать с сигнатурой bool wait_and_pop(T &Data) чтобы понимать есть там что консьюмить или нет
(3) Внутри wait_and_pop условие должно выглядеть так:

CondCons.wait(Lk, [this] { return !empty() || done(); });
if (empty())
return false;

Даже если у нас сигнализирован done, задачи могут быть недоразобраны и поэтому критерий return false это только empty.

(4) Внутри push признак done вообще проверять не надо т.к. это признак отработки всех продьюсеров. Там играет роль только full.
(5) В интерфейсе необходим метод is_empty_and_done() чтобы по нему консьюмеры понимали когда начинать выходить.

В общем это жесть. Пять ошибок в довольно простом коде и я не уверен что я ещё чего-то не пропустил.

Полу-финальные версии bounded stack и bounded queue с тестами на то что они не теряют задач я выложил сюда:

https://github.com/tilir/cpp-masters/blob/master/queues/classic_queue.cc
https://github.com/tilir/cpp-masters/blob/master/queues/classic_stack.cc

Нужна помощь зала в проверке не упустил ли я ещё чего-нибудь. Хочу в среду с этого начать лекцию и не хотелось бы облажаться ещё в чём-нибудь столь же тонком.

#questions
👍34🤯10👏4🤨1



tgoop.com/cpp_lects_rus/86
Create:
Last Update:

Работа над ошибками (нужна помощь зала).

В комментариях мой уважаемый подписчик Роман Митин указал что я на лекции показал неправильный пример bounded MPMC queue -- на самом деле извлечение и вставка там шли с одного конца и таким образом это был скорее bounded MPMC stack. Для многопоточной среды разница не так велика -- задачи ставятся в "очередь" и разбираются консьюмерами и в общем по циклограмме работы сложно отличить что там было. Но я решил сделать настоящую очередь и заодно улучшить тесты.

И вот тут я обратил внимание что у меня было ещё несколько ошибок, пока в комментариях не замеченных.

(1) В случае multi-producer делать wake_and_done надо на всех продьюсеров один раз иначе бывает так что консьюмеры повыходили но не все продьюсеры ещё закончили.
(2) Саму функцию wait_and_pop надо делать с сигнатурой bool wait_and_pop(T &Data) чтобы понимать есть там что консьюмить или нет
(3) Внутри wait_and_pop условие должно выглядеть так:

CondCons.wait(Lk, [this] { return !empty() || done(); });
if (empty())
return false;

Даже если у нас сигнализирован done, задачи могут быть недоразобраны и поэтому критерий return false это только empty.

(4) Внутри push признак done вообще проверять не надо т.к. это признак отработки всех продьюсеров. Там играет роль только full.
(5) В интерфейсе необходим метод is_empty_and_done() чтобы по нему консьюмеры понимали когда начинать выходить.

В общем это жесть. Пять ошибок в довольно простом коде и я не уверен что я ещё чего-то не пропустил.

Полу-финальные версии bounded stack и bounded queue с тестами на то что они не теряют задач я выложил сюда:

https://github.com/tilir/cpp-masters/blob/master/queues/classic_queue.cc
https://github.com/tilir/cpp-masters/blob/master/queues/classic_stack.cc

Нужна помощь зала в проверке не упустил ли я ещё чего-нибудь. Хочу в среду с этого начать лекцию и не хотелось бы облажаться ещё в чём-нибудь столь же тонком.

#questions

BY C++ and other lectures


Share with your friend now:
tgoop.com/cpp_lects_rus/86

View MORE
Open in Telegram


Telegram News

Date: |

Telegram channels enable users to broadcast messages to multiple users simultaneously. Like on social media, users need to subscribe to your channel to get access to your content published by one or more administrators. Members can post their voice notes of themselves screaming. Interestingly, the group doesn’t allow to post anything else which might lead to an instant ban. As of now, there are more than 330 members in the group. Hashtags How to create a business channel on Telegram? (Tutorial) Channel login must contain 5-32 characters
from us


Telegram C++ and other lectures
FROM American