есть ограниченный размер контейнера, один читает, другой пишет. Делаем потокобезопасно
Код по ссылке ниже. Есть два вопроса: 1) таки правильно ли я его реализовала или это какая-то ересь, а не продюсер-консумер?
2) почему если запускать такую демо-версию, в итоге имеем пустой вектор (удалятель отрабатывает последний), а если раскомментить еще и поток вывода в строке 85, то наоборот получаем заполненный контейнер еще и циферками подряд (т.е. фактически сразу отрабатывает add, и никогда не отрабатывает remov)?
https://pastebin.com/3Wupx2KR
А что будет, если лок мьютекса вынести на уровень функции?
Как бы что такое продюсер консьюмер - это ещё вопрос
1) Ну логически правильно. Но если нужно высококлассно выполнить задачу, то нужно будет скорее всего запилить отдельный класс для этого всего. И явно не использовать внутри std::vector. Лучше уж какую-нибудь очередь std::queue. 2) Тут же race condition и неизвестно кто и когда успеет что делать. Лучше join-ить продюсеры перед консюмерами. И возможно std::cout просто как-то синхронизирует эти потоки, вот и все.
> A fast multi-producer, multi-consumer lock-free concurrent queue for C++11 https://github.com/cameron314/concurrentqueue
Устал читать все это сегодня. В конце концов выходной же...
Обсуждают сегодня