Я новичок в C++ и пишу многопоточное приложение, в котором разные авторы будут толкать объекты в стек, а читатели вытаскивают их из стека (или, по крайней мере, нажимают указатель на объект) ..Thread-safe C++ stack
Существуют ли какие-либо структуры, встроенные в C++, которые могут обрабатывать это без добавления кода блокировки и т. Д.? Если нет, как насчет библиотек Boost?
EDIT:
Hi. Спасибо за начальные большие ответы. Я предполагаю, что одна из причин, по которой я думал, что это может быть встроено, состояла в том, что я думал чисто в пространстве x86 и думал, что PUSH/POP указателей должен быть атомарным действием на уровне инструкций.
Я не уверен, что моя первоначальная догадка верна или нет, но я думаю, это не обязательно было бы верно для всех платформ. Хотя, если вы работаете на x86, вы получаете атомарные PUSHes и POP в стек, и если да, то делает ли это по существу сделать его заблокированным?
Если вас интересует атомарность инструкций x86 PUSH/POP, задайте отдельный вопрос - он не имеет ничего общего с C++, который не будет использовать такие инструкции для доступа к структуре данных стека. – 2009-04-26 14:26:09
Комитет более занят написанием параллельных классов проповеди на DDJ, вместо того, чтобы создавать атомарные и намного лучшие абстракции модели памяти для компилятора, обязательные для TR1 (возможно, даже не в TR2). Ответ: вы действительно не нажимаете и не публикуете и, следовательно, неявно изменяете регистры по потокам, скажем, что в настоящее время работает на разных ядрах? :-) Хороший выстрел, но не получится .. Вы не можете сделать это без блокировки или, по крайней мере, без молотка CAS. Для фанатов C++: им нужно просто сесть и определить и согласовать существующие протоколы согласованности, + оставить некоторые возможности для новых разработок. –
Для заинтересованных людей я изучил атомные операции, а Intel поддерживает DCAS через cmpxchg16b. К сожалению, AMD имеет только cmpxchg8b. Не важно для меня, так как я пишу для компьютеров Intel :) – bugmenot77