Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
yulicesar
4 / 4 / 0
Регистрация: 21.09.2011
Сообщений: 20
#1

разработка объекта синхронизации - C++

21.09.2011, 17:42. Просмотров 404. Ответов 0
Метки нет (Все метки)

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

Как это реализовать - понятно. Нужно 2 флага (мьютекса) и один семафор. Алгоритм:
при запросе на чтение
- ожидаем сброса флага ожидания доступа на запись
- ожидаем сброса флага записи, если запись инициирована из другого потока
- инкрементируем семафор чтения
при завершении чтения
- декрементируем семафор чтения

при запросе на запись
- ожидаем сброса флага ожидания записи если он установлен
- устанавливаем флаг ожидания записи
- ожидаем обнуления семафора чтения
- устанавливаем флаг записи, сбрасываем флаг ожидания записи
при завершении записи
- сброс флага записи

Но тут понадобилась еще одна функциональность: при нахождении в режиме чтения возможность "повысить" уровень привилегий до записи. И тут возникают проблемы: войти в контекст записи, находясь в контексте чтения, невозможно, так как семафор не будет обнулен - один читатель (текущий тред) все таки должен остаться в режиме чтения. Вывести его оттуда принудительно нельзя - возможно другой тред уже захватил очередь записи, взведя флаг ожидания записи, и вывод текущего треда из контекста чтения приведет к захвату монопольного доступа к ресурсу со стороны другого потока. А именно этого допускать нельзя! Основная идея этого функционала объекта синхронизации - отсутствие между чтением и повышением до записи монопольных доступов со стороны других тредов. В противном случае, если ожидать в читающем треде сброса флага ожидания записи - это приведет к дедлоку (пишущий тред в это время ожидает освобождения семафора чтения).
Подскажите пожалуйста как решить проблему

Добавлено через 55 минут
забыл добавить... ОС виндовс. хотя это непринципиально, поскольку проблема алгоритмическая
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2011, 17:42     разработка объекта синхронизации
Посмотрите здесь:

Синхронизации многопоточности - C++
добрый день, пытаюсь сделать синхронизацию потом на примере producer\consumer, но что-то не выходит, я в consumere сделал ожидания...

Функция синхронизации - C++
Что я делаю не так? Подскажите, потому что сам не могу найти(функция должна перебирать элементы в vectore и map, и оставить только...

Средства синхронизации в windows - C++
В программе порождаються два процесса работающие с матрицей розмером m*n .Один поток транспонирует матрицу ,другой выводит сумму строк в...

Объекты синхронизации. мьютексы, семафоры - C++
помогите пожалуйста. . Реализовать на семафоре мьютекс. Количественные характеристики мьютекса должны быть аналогичны соответствующему...

Понятие синхронизации потоков и процессов. Семафоры и мьютексы - C++
Хотелось бы обсудить и уточнить некоторые понятия: 1. Корректно ли следующее утверждение. Синхронизация - это обеспечение...

Передача объекта методу другого объекта другого класса - C++
Всем привет. Есть у меня класс test1, который имеет конструкторы только с параметрами. Другой класс test2 имеет конструктор, который...

Разработка алгоритма 2 - C++
РАзработать алгоритм,определяющий принадлежит ли точка плоскости.Точку и плоскость задать в виде структур.Необходимые координаты взять из...

Разработка функции - C++
Разработать функцию, в которую передается массив типа int, возвращающая количество нечетных элементов массива.

Расширенная разработка - C++
Появилась идея более-менее серьёзного для меня проекта. Разработал карту, костяк документации (структура, методика и т.д.), графики всякие...

Разработка шейдеров - C++
vec3 n = normalize(Normal); vec3 l = normalize(LightDirection); vec3 v = normalize(Viev); float diffuseFaktor = max(0.0, dot(n,1)); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru