Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: синхронизация при использовании shared memory  (Прочитано 15988 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 10-03-2010 17:29 » 

Господа, у меня тормоз...

Дано:
а) основное приложение (MainApp)  и длл (DllApp), которая подгружается в основное приложение динамически
2) отдельная либа (UsedClasses), в которой находится класс (mainContainer), используемый обоими приложениями из а). При этом класс изобилует статическими объектами (и это уже не изменить - с этим надо жить)
3) если в основном приложении MainApp произошли изменения объекта типа mainContainer, то этот обновленный объект должен быть передан длл-лине, т.е. ее объект должен быть изменен ( т.о. у длл-лины будет копия объекта из MainApp). [ ну или наоборот - изменения в длл-лине д.б. переданы основному приложению]
4) Для того, чтобы иметь возможность копировать данные, решила применить shared memory (CreateFileMapping, OpenFileMapping, MapViewOfFile ).
Сразу же оговорюсь, я еще не знаю, будет ли это на 100% работать Ага

Проблема:
Выяснилось, что после того, что в shared memory был создан файл и туда помещена инфа, файл нельзя закрывать, иначе при попытке считывания файл не находится.
Ладно, значит, надо как-то остановить функцию записи в файл до тех пор, пока оттуда не будет все считано.
Т.е.:
Код:
void DllTestClass::writeInSharedMemory()
{
   CreateFileMapping();
   MapViewOfFile();
   CopyMemory();

    !!!!!!!!!!!!!!!!!!
     вот тут надо как-то прерваться, пока получатель не считает данные:
     т.е. посадить блокировку, которую снимет получатель, и ждать, пока это
     произойдет
    !!!!!!!!!!!!!!!!!
 
   UnmapViewOfFile();
   CloseHandle();
}


void readFromSharedMemory()
{
    OpenFileMapping();
    MapViewOfFile();
    CloseHandle(); // это уже спорно...

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    тут снять блокировку
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

Вопрос - как??? У меня уже полный тормоз...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
zubr
Гость
« Ответ #1 : 10-03-2010 17:51 » 

1. Зачем вообще в данном случае расшаренная память. Ведь все происходит в рамках одного процесса. Указатель на выделенный блок памяти будет ликвиден в 3-х указанных модулях.
2. Синхронизацию можно делать через стандартные объекты синхронизации (события, семафоры, мутексы, критические секции):
Код:
   CreateFileMapping();//я бы это делал один раз при открытии приложения
   WaitForSingleObject();
   ResetEvent();
   MapViewOfFile();
   CopyMemory();
   UnmapViewOfFile();
   SetEvent();
   CloseHandle();//я бы это делал один раз при закрытии приложения
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-03-2010 19:24 » 

Malaja, да, shared memory нужна, когда есть 2 и более процессов (exe), а все dll загружаются в то же адресное пространство, где работает процесс, поэтому достаточно передать банальный указатель.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 11-03-2010 10:06 » 

zubr, Dimka,

во-первых, спасибо! 
1) zubr, я вчера слету начала лепить мутекс, но поняла, что тут он не подходит. А про event забыла напрочь...

2) коллегу, подкинувшего задание, убью Ага я ему сразу сказала, что все находится в одном адресном пространстве, посему никаких проблем быть не должно. Но он начал меня уверять, что я напрочь заблуждаюсь, что это не работает - он пробовал. И вообще, мол, когда я это делала в последний раз? Мда, а я этим таки занималась последний раз лет 5 назад, о чем ему и сообщила. Вот тут он мне и рассказал, что я все забыла, что не помню подробностей и мелочей, ну и т.д. ...
С учетом того, что он началъник и к тому же рассказал, что он уже пробовал, я ему предложила решение через расшареную память. Ну а раз предложила, то и начала выполнять. Ну и уткнулась в проблему с синхронизацией...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
zubr
Гость
« Ответ #4 : 11-03-2010 10:47 » new

Malaja, у твоего коллеги по всей видимости руки кривые.
А зачем синхронизация вообще? MainApp и DllApp у тебя будут работать в разных потоках?
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 11-03-2010 12:58 » 

zubr,
ты знаешь, так вроде бы были нормальные Ага Я думаю, что у него что-то другое не срослось и в виде побочного эффекта не сработала передача данных, а он решил, что это и была основная проблема.

насчет синхронизации:
проблема с расшареной памятью заключалась в том, что если пишущее в нее инфу приложение закрывало файл, то читающее приложение уже не могло его открыть - видимо, система этот файл удаляет нафиг (я почитала сообщения в форумах - это не только моя проблема).
Т.о. после внесения информации в файл надо дать считывающей стороне возможность прочитать инфу и только после этого правильно закрыть файл.
Вот и получается - либо сообщениями перекидываться, либо синхронизировать (т.е. делать именно то, что ты написал - после окончания записи в файл становиться на прослушивание event-а. А второе приложение после окончания считывания должно этот самый event изменить. Т.о. ждущая сторона сможет закрыть файл) .
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
zubr
Гость
« Ответ #6 : 11-03-2010 13:48 » 

Цитата
When the process no longer needs access to the file-mapping object, it should call the CloseHandle function. When all handles are closed, the system can free the section of the paging file used by the object.
MSDN
То есть объект файлового отражения не закроется пока все его открытые хендлы не будут закрыты. Отсюда вывод - хедлы расшаренной памяти закрывай при закрытии приложения и выгрузке длл.
Синхронизация нужна, если обращение к расшаренной памяти идет из нескольких процессов или потоков. То есть если к примеру один процесс что то записывает в память, а другой в это время что то читает - получится ерунда. В твоем случае синхронизация совершенно бессмысленна, так как, как я понимаю, все выполняется основном потоке приложения.
« Последнее редактирование: 11-03-2010 13:52 от zubr » Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #7 : 11-03-2010 16:19 » 

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

В моем случае все это никому не нужно - надо работать с поинтерами.
Там будут другие приколы из-за наличия в классе кучи статических функций и переменных. Но это уже следующая стадия.

Еще раз всем спасибо!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 12-03-2010 04:28 » 

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

Дай ему в глаз.

вот на будующее
http://www.boost.org/doc/libs/1_42_0/doc/html/interprocess.html
если захочешь написать велосипед, то хотя бы будет, где подглядеть. Улыбаюсь
а так очень рекомендую, отказаться от своих велосипедов Улыбаюсь
Записан

Странно всё это....
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #9 : 12-03-2010 16:30 » 

LogRus,
это указание я выполню в точности и с удоволствием ;_) Тем более, что вчера я уже это начала  Отлично
Т.е. я популярно объяснила товарищу, что я таки была права и нам хватит классических поинтеров.
Ну а с остальным надо будет разбираться - это уже мелочи.

За ссылки отдельное спасибо! Я этой библиотекой никогде не пользовалась - знаю просто о ее существовании.
В проекте народ использует ACE, так что в крайнем случае было бы у кого спросить, , но опять же была просьба оставить все библиотеки в покое и сделать все своими ручками, чтобы проще было наблюдать за тем, работает передача данных или нет (дабы не кивать еще и на неверное применение библиотечных функций).
Я спорить не стала, т.к. в тот момент это было бессмысленно - я товарища знаю... Плюс я сама сидела в полугриппозно-задерганном состоянии и соображала уже с трудом... Поэтому решила сначала спокойно сама разобраться в вопросе, а потом уже что-то кому-то доказывать.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 15-03-2010 04:53 » 

Разобраться это дело хорошее Улыбаюсь
Но шансов, что я багов наделаю при реализации IPC ГОРАЗДО больше, чем при использовании чего-то написанного и покрытого автотестами (которые кстати тоже надо писать и поддерживать), у нас не пользуются своими реализациями довольно давно - слишком дорого, просто капец, проще один раз купить или взять открытое, чем тратить человеко-месяцы на поддержку
только сокеты напрямую используем, но они правда не настолько разные на Windows и Linux.
« Последнее редактирование: 15-03-2010 04:56 от LogRus » Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines