неблокирующая потокобезопасная очередь в C ++? - PullRequest
25 голосов
/ 29 октября 2009

Есть ли в C ++ потокобезопасный неблокирующий класс очереди?

Возможно, это основной вопрос, но я давно не занимался C ++ ...

РЕДАКТИРОВАТЬ: удалено требование STL.

Ответы [ 8 ]

17 голосов
/ 29 октября 2009

Предполагая, что ваш ЦП имеет функцию сравнения и замены по всему указателю (compxchg8b на 486 или выше, compxchg16b на большинстве машин amd64 [не представлен на некоторых ранних моделях Intel]) ... Есть алгоритм здесь .

Обновление: нетрудно перевести это на C ++, если вы не боитесь делать немного работы. : P

Этот алгоритм предполагает структуру "указатель с тегом", которая выглядит следующим образом:

// Be aware that copying this structure has to be done atomically...

template <class T>
struct pointer
{
   T *ptr;
   uintptr_t tag;
};

Затем вы хотите обернуть инструкции lock cmpxchg{8|16}b некоторым встроенным ассемблером ...

Может быть, тогда вы можете написать узел очереди следующим образом:

template <class T>
struct queue_node
{
    T value;
    pointer<queue_node<T> > next;
};

Остальное - более или менее расшифровка алгоритма, с которым я связался ...

6 голосов
/ 29 октября 2009

В прошлом году доктор Добб, похоже, был популярным предметом:

6 голосов
/ 29 октября 2009

Поскольку текущий стандарт C ++ даже не признает существование потоков, наверняка нет ничего поточно-ориентированного в STL или любой другой части стандартной библиотеки.

2 голосов
/ 29 октября 2009

Вам нужно реализовать это самостоятельно или использовать библиотеку, реализующую это. Чтобы сделать это самостоятельно, вы можете посмотреть на это:

Реализация поточно-ориентированной очереди с использованием условных переменных

1 голос
/ 19 августа 2015

Может быть, уже слишком поздно.Для дальнейшего использования, это хорошая реализация очередей без блокировки (встроенная защита потоков с некоторыми оговорками).

Мультипроизводитель - Мультипотребитель

http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++

https://github.com/cameron314/concurrentqueue

Один производитель - Отдельный потребитель

http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++

https://github.com/cameron314/readerwriterqueue

1 голос
/ 29 октября 2009

Краткий ответ - нет. STL не занимается параллелизмом (по крайней мере, на уровне спецификации). Текущий стандарт C ++ ничего не говорит о потоках.

Вы можете легко построить такую ​​очередь поверх STL и Boost - просто оберните std::queue и boost::mutex в свой пользовательский класс.

1 голос
/ 29 октября 2009

Контейнеры STL не являются поточно-ориентированными, вам следует применять обработку для одновременного доступа.
Этот проект (C ++) предназначен для одновременного доступа: CPH STL
и бумага о .

0 голосов
/ 30 июня 2011

Неофициальный в настоящее время Boost.Lockfree - это то, что нужно учитывать. Я использую как FIFO, так и атомарные типы.

...