Я наткнулся на следующий пост, в котором подробно описана очередь без блокировки для производителя:
C ++ Lock свободная очередь производителя / потребителя
который использует специально написанный список ссылок. Какова цель написания связанного списка, когда можно просто использовать std::queue
и написать некоторые обертки доступа вокруг структуры данных?
Невозможно спроектировать std::list
где push_back
а также pop_front
не изменяйте размер члена. Если у вас есть два потока, вызывающих их одновременно, они, вероятно, повредят список. Вы можете написать аксессуар-обертку, чтобы сделать его безопасным, с помощью замков. Это побеждает цель структуры без блокировки. И то и другое push_back
а также pop_front
из std::deque
потребуется изменить внутренний «вектор» указателей на узлы, и если они вызываются одновременно двумя разными потоками, опять же, они повреждают деку.
Можно легко написать очередь производителя или потребителя, свободную от блокировки списка или циклического буфера, но ни один стандартный контейнер C ++ не подходит.
Других решений пока нет …