Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

Разработка динамического объекта на базе xml структур - C++
Помогите плиз с заданием

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

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

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

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

Требуется ли при удалении объекта посредством delete указывать тип объекта? - C++
например, есть указателиvoid *p1; void *p2; есть VCL-объект TButton, есть самописный класс TMyClass; создаются объектыp1=new...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 17:42
Привет! Вот еще темы с ответами:

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

Система синхронизации данных по определенному такту - C++
Здравствуйте! Меня интересует различные подходы к проектированию системы для синхронизации данных в многопоточном приложении. ...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования - C++
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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