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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ как задать функции в с++ http://www.cyberforum.ru/cpp-beginners/thread354542.html
например в паскале можно вот так procedure (a) procedure= procedure(a+1)+procedure (ф+2) begin input (a,b) procedure (a,b) как так извините если не правильно главное суть. как...
C++ Задачи все сюда писать не буду они тут в файле. По возможности кто какие сможет помогите решить. Но это самая сложная Первоначальное напряжение в цепи равно 200 вольт. Известно, что оно меняется через... http://www.cyberforum.ru/cpp-beginners/thread354538.html
C++ Несколько условий в одном if
например в паскале можно if (a>b)and(a<10) в с++ как этосделать?
C++ Решение неравенства
Помогите с решением следующей задачи. Необходимо составить программу решения неравенства a*x^2+b<=0. Значения a и b вводятся с клавиатуры. При отсутствии решения или бесчисленном множестве решений...
C++ Перегрузка оператора new и delete http://www.cyberforum.ru/cpp-beginners/thread354517.html
привет! подскажите, каким образом можно перегрузить операторы new и delete? заранее спасибо!
C++ Запись, чтение объектов в файл через указатели. не могу прочитать объекты из файла. Сломал голову. Все перепробовал. Препод отправил гуглить))). Писать что то вроде пишет? Но что? А читать при перезапуске программы отказывается. Говорит что в... подробнее

Показать сообщение отдельно
yulicesar
4 / 4 / 0
Регистрация: 21.09.2011
Сообщений: 20

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

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

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

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

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

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

Добавлено через 55 минут
забыл добавить... ОС виндовс. хотя это непринципиально, поскольку проблема алгоритмическая
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru