Я пытаюсь создать связанный список в C++, который допускает одновременный доступ. Очевидно, что использование одного блокировки для этого списка крайне неэффективно, поскольку параллельные области могут обновляться параллельно. Теперь, каковы мои параметры, кроме сохранения блокировки на узел?связанный список
Кроме того, будет ли более безопасная версия в этом случае неблокирующей версией? Любые релевантные ссылки, кто-нибудь?
EDIT: Спасибо за ответы людей. Пара вещей, которые я хотел бы добавить:
- Как насчет хранения N блокировок для каждого M-узла вместо 1: 1 блокировки: отношение узлов? Некоторые потоки будут ждать, но это своего рода компромисс. Как вы думаете?
- Если я намереваюсь найти какой-либо узел в этом связанном списке, похоже, что все мьютексы должны быть заблокированы. Это проблема, поскольку блокировка и разблокировка всех мьютексов занимает много времени. Кто-нибудь имеет лучшую альтернативу?
- Я открыт для неблокирующих алгоритмов. Но как использовать CAS в хорошем старом C++ без использования сборки? Я слышал, что gcc имеет некоторые атрибуты __sync, которые выполняют аналогичную работу, но не уверены.
- С неблокирующим подходом, как вы можете найти в связанном списке?
Рассмотрите возможность использования чего-то, что уже существует, вместо того, чтобы изобретать это колесо. Одним из примеров может быть «concurrent_vector» от TBB от Intel: http://www.threadingbuildingblocks.org/ –
Возможно, также будет решение Boost - я не уверен. –