Эффективная Реализация Блокировки Чтения-Записи На Основе «Блокированного Доступа К Переменным».



Введение Специфика проекта, в котором я работаю, такова, что, с одной стороны, не допускается использование сторонних библиотек (за небольшим исключением), а с другой стороны, упор делается на очень глубокую оптимизацию кода.

Поэтому нам часто приходится изобретать велосипед в виде собственных реализаций.

В ходе данной публикации я хочу поделиться идеей реализации известного примитива синхронизации.



"> блокировка читателей-писателей



на основе так называемых атомарных операций.

Как известно, блокировка чтения-записи предназначена для решения задачи синхронизации доступа к общему ресурсу таким образом, чтобы избежать одновременного чтения и записи, но при этом разрешить параллельное чтение сколь угодно большому количеству потоков.





Поиск решения

Поначалу я отнесся к задаче довольно легкомысленно, но, как оказалось, зря.

Начну с того, что просмотрев доступные ресурсы, я так и не нашел реализации, которая мне понравилась.

Как оказалось, самой большой проблемой было заблокировать приходящих «читателей» и «писателей», чтобы они не оставались в таком состоянии навсегда.

Если, например, вы организуете ожидание с помощью

"> переменные условия



, то очень легко попасть в ситуацию, когда входящий поток должен быть заблокирован, но пока происходит блокировка, поток, владевший ресурсом, заканчивает работу с ним и посланный им сигнал завершения не доходит до адресата.

Он, в свою очередь, успешно завершает переход в состояние «ожидания» и на этом этапе реализация дает сбой.

Проблема на самом деле решаема введением дополнительной логики, но в моем случае такая реализация оказалась даже медленнее, чем бессмысленная и беспощадная блокировка каждого входящего потока.

Я, конечно, не претендую на то, что это абсолютная истина и возможно я что-то упустил, но я начал искать другие возможности.

Все это время у меня было ощущение, что проблему можно решить, используя гораздо более простые механизмы.



"> заблокированный доступ к переменным



, с помощью которого я ранее довольно элегантно справился с

"> двойная проверка блокировки



оптимизация.

Я начал думать в этом направлении и результат был следующий.





Выполнение

Проекту необходима поддержка систем QNX (именно для этого предназначен продукт) и Windows (эмуляция, отладка и т.д.).

Поскольку второй вариант гораздо более популярен, я приведу для него реализацию на C++.

Однако остановлюсь на одном аспекте перехода на POSIX. Так:



Класс пустой
  class CRwLock

{

public:

 
Теги: #RW Lock #оптимизация #многопоточное программирование #C++ #Алгоритмы
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2013-04-16 20:17:56
Баллов опыта: 539
Всего постов на сайте: 2
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.