![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
sol78 |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
Мне нужно организовать что то вроде shared memory только под Виндовс для интер-процессинг.
После поисков в Гугле, использую File Mapping. Но ничего не нашла о реализации синхронизации между врайтером и ридером... Т.е. как ридер дожен узнать, что есть дата.. и т.д. Вот тут код, как лучше довести его до ума...:
Reader
Writer
|
||||||||
|
|||||||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
для синхронизации процессов есть мъютексы
или переменная в общей памяти Это сообщение отредактировал(а) GoldFinch - 5.4.2009, 19:01 |
|||
|
||||
sol78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
можно пример реализации мутакса для данной задачи??
Что то я не пойму а кто сообщит врайтеру что есть дата? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Одного мьютекса не хватит. Кроме того непонятен протокол обмена данными через эту shared memory. Какие данные, какими порциями должны передаваться?
Тут явно понадобится мьютекс, евент или семафор и общие переменные в этой самой разделяемой памяти |
|||
|
||||
sol78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
xvr, протокол сравнительно простой. Один поток пишет данные в память и читаем другим потоком, читаем и записываем одинаковыми порциями сравнительно не большими. Важна скорость и синхронизация.
У меня есть ридер и врайтер (2 потока). Когда у врайтера появляеся дата, он выбрасывает ивент. Ридер тем временим жидает это сыбытие. Читает данные .... а что дальше где синхронизировать дальше...??? |
|||
|
||||
asd |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: 1 Всего: 1 |
CreateNamedPipe вам поможет.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
asd, так же можно слать через сокет или по POP3 на почту
Добавлено через 1 минуту и 6 секунд
смысле что дальше? дальше ридер обрабатывает данные и ждет новых |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Т.е. вам нужна очередь пакетов фиксированной длинны. Я правильно понял?
Система распадается на 2 практически независимые части - очередь (с доступом из 2х процессов) и система посылки сообщений. Очередь организуется в виде кольцевого буфера. Все манипуляции с ней (добавление и удаление пакетов) делаются под закрытым мьютексом Синхронизация делается в виде 2х семафоров. Один контролирует пустое пространство в очереди и его начальное значение - размер очереди в пакетах. Второй считает количество пакетов в очереди, его начальное значение - 0 Добавление пакета:
|
||||
|
|||||
sol78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
xvr, спасибо за доступное обьяснение...
Да но я пишу под Windows, подскажите плиз что можно использовать для реализации семафоров в Windows. Как мутех можно использовать Критикал Секшн? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Семафоры ![]()
|
||||
|
|||||
Alca |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Это сообщение отредактировал(а) Alca - 6.4.2009, 13:12 |
||||
|
|||||
sol78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
Вот пимерно что получается:
Как реализовать 'Освобождаем первый семафор' ? Это сообщение отредактировал(а) sol78 - 6.4.2009, 13:15 |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
::ReleaseSemaphore |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В CSharedMemoryArea::WriteOnSharedMemory WaitForSingleObject нужно делать на m_hFreeSpaceCouter, а в CSharedMemoryArea::ReadFromSharedMemory на m_hPackageCounter
И не забыть при создании установить счетчик m_hFreeSpaceCouter в максимальное количество пакетов (иначе будет deadlock) |
|||
|
||||
asd |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: 1 Всего: 1 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |