Есть много разных способов сделать это, в зависимости от того, как вы собираетесь использовать список.
Во-первых, для списка одна блокировка мьютекса не обязательно является большой проблемой, потому чтосписки могут поддерживать соединение.Скажем, у вас есть список символов AF и другой список BCDE.Вам не нужно блокировать мьютекс, вставлять B, блокировать его снова, вставлять C и т. Д. Вы можете вставить BCDE сразу между A и F, установив следующий указатель A на B и следующий указатель E на F, образуя ABCDEF.Независимо от того, сколько элементов вы хотите вставить одновременно, вам нужен только один замок.Это верно даже для двусвязного списка.Таким образом, это не может быть узким местом в вашем приложении.
Предполагая, что это будет узким местом, вам нужно подумать, будет ли у вас один или несколько писателей и один или несколько читателей.
Предполагая, что у вас есть один писатель и несколько читателей, вы можете полностью избежать блокировок мьютекса, используя атомарные инструкции, если они доступны для вашей архитектуры.В GCC они доступны через встроенные функции __sync_ *, а в Visual C ++ они доступны через Interlocked *, но если вы застряли с компилятором, который не поддерживает их напрямую, вы все равно можете использовать их через встроенную сборку.Автор будет использовать атомарные инструкции для атомарной установки следующих указателей для исправления элементов в и из списка.
Надеюсь, это поможет вам начать работу.Чтобы получить глубокий ответ, я бы предложил задать еще один вопрос, включая:
- Есть ли один / несколько читателей?
- Есть ли один / несколько авторов?
- Один или два связанных списка?
- Какое-то представление о вашем сценарии использования.