Введение Специфика проекта, в котором я работаю, такова, что, с одной стороны, не допускается использование сторонних библиотек (за небольшим исключением), а с другой стороны, упор делается на очень глубокую оптимизацию кода.
Поэтому нам часто приходится изобретать велосипед в виде собственных реализаций.
В ходе данной публикации я хочу поделиться идеей реализации известного примитива синхронизации.
"> блокировка читателей-писателей
на основе так называемых атомарных операций.
Как известно, блокировка чтения-записи предназначена для решения задачи синхронизации доступа к общему ресурсу таким образом, чтобы избежать одновременного чтения и записи, но при этом разрешить параллельное чтение сколь угодно большому количеству потоков.
Поиск решения
Поначалу я отнесся к задаче довольно легкомысленно, но, как оказалось, зря.Начну с того, что просмотрев доступные ресурсы, я так и не нашел реализации, которая мне понравилась.
Как оказалось, самой большой проблемой было заблокировать приходящих «читателей» и «писателей», чтобы они не оставались в таком состоянии навсегда.
Если, например, вы организуете ожидание с помощью
, то очень легко попасть в ситуацию, когда входящий поток должен быть заблокирован, но пока происходит блокировка, поток, владевший ресурсом, заканчивает работу с ним и посланный им сигнал завершения не доходит до адресата.
Он, в свою очередь, успешно завершает переход в состояние «ожидания» и на этом этапе реализация дает сбой.
Проблема на самом деле решаема введением дополнительной логики, но в моем случае такая реализация оказалась даже медленнее, чем бессмысленная и беспощадная блокировка каждого входящего потока.
Я, конечно, не претендую на то, что это абсолютная истина и возможно я что-то упустил, но я начал искать другие возможности.
Все это время у меня было ощущение, что проблему можно решить, используя гораздо более простые механизмы.
"> заблокированный доступ к переменным
, с помощью которого я ранее довольно элегантно справился с
"> двойная проверка блокировки
оптимизация.
Я начал думать в этом направлении и результат был следующий.
Выполнение
Проекту необходима поддержка систем QNX (именно для этого предназначен продукт) и Windows (эмуляция, отладка и т.д.).Поскольку второй вариант гораздо более популярен, я приведу для него реализацию на C++.
Однако остановлюсь на одном аспекте перехода на POSIX. Так:
Класс пустой
class CRwLock
{
public:
Теги: #RW Lock #оптимизация #многопоточное программирование #C++ #Алгоритмы
-
Asus Готовит Несколько Новых Продуктов Eee
19 Dec, 24 -
Рбк: Оно Пойдет На Армаду
19 Dec, 24