Я пытаюсь создать связанный список в С++, который позволяет осуществлять одновременный доступ. Очевидно, что использование одного блокировки для этого списка крайне неэффективно, поскольку параллельные области могут обновляться параллельно. Теперь, каковы мои параметры, кроме сохранения блокировки на node?
Кроме того, будет ли более эффективная ставка в этом случае неблокирующей версией? Любые релевантные ссылки, кто-нибудь?
РЕДАКТИРОВАТЬ: Спасибо за ответы людей. Несколько вещей, которые я хотел бы добавить:
- Как насчет хранения N блокировок для каждого узла M вместо блокировки 1:1: отношение node? Некоторые потоки будут ждать, но это своего рода компромисс. Как вы думаете?
- Если я намереваюсь найти node в этом связанном списке, похоже, что все мьютексы должны быть заблокированы. Это проблема, поскольку блокировка и разблокировка всех мьютексов занимает много времени. Кто-нибудь имеет лучшую альтернативу?
- Я открыт для неблокирующих алгоритмов. Но как использовать CAS в хорошем старом С++ без использования сборки? Я слышал, что gcc имеет некоторые атрибуты __sync, которые выполняют аналогичную работу, но не уверены.
- С неблокирующим подходом, как вы можете найти ссылку в связанном списке?