Причина состоит в том, что константа для параметра только применяется локально в функции, так как это работает над копией данных. Это означает, что функциональная подпись является действительно тем же так или иначе. Это - вероятно, плохой стиль, чтобы сделать это много все же.
я лично склонен не использовать константу за исключением параметров указателя и ссылки. Для скопированных объектов это действительно не имеет значения, хотя это может быть более безопасно, поскольку это сигнализирует о намерении в функции. Это - действительно личный выбор. Я действительно склонен использовать const_iterator, хотя, когда цикличное выполнение на чем-то и я не предназначаю при изменении его, таким образом, я предполагаю каждому его собственное, пока правильность константы для ссылочных типов строго сохраняется.
Предположим, что ваш ЦП имеет функцию сравнения и замены с двойным указателем (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
с помощью некоторого встроенного asm .. .
Может быть, тогда вы сможете записать узел очереди следующим образом:
template <class T>
struct queue_node
{
T value;
pointer<queue_node<T> > next;
};
Остальное является более или менее транскрипцией алгоритма, с которым я связался ...
Поскольку текущий стандарт C ++ даже не признает существование потоков, в STL или любой другой части стандартной библиотеки, безусловно, нет ничего поточно-безопасного.
Краткий ответ - нет. STL не занимается параллелизмом (по крайней мере, на уровне спецификации). Текущий стандарт C ++ ничего не говорит о потоках.
Вы можете легко построить такую очередь поверх STL и Boost - просто оберните std :: queue
и boost :: mutex
в вашем пользовательском классе.
Вам нужно реализовать это самостоятельно или использовать библиотеку, реализующую это. Чтобы сделать это самостоятельно, вы можете взглянуть на это:
Реализация потокобезопасной очереди с использованием переменных условий
Контейнеры STL не являются потокобезопасными, вам следует реализовать свою обработку для одновременного доступа.
Существует этот проект (C ++), который нацелен на обслуживание одновременного доступа: CPH STL
и статья о .
Кажется, это была популярная тема в прошлом году доктора Добба: