Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация процессов, в асинхронном коде 
:(
    Опции темы
Lazin
Дата 7.1.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



мне нужно записывать данные в большое количество файлов, асинхронно, причем несколько приложений могут писать данные в один и тот-же файл, я использую IOCP для организации неблокирующего I/O
что-бы не испортить данные, каждое приложение, перед тем, как записать что-либо, ждет именованное событие, после того, как запись окончена, приложение снова устанавливает это событие в signaled state
теперь собственно проблема
если один из потоков, входящих в пулл потоков, пытается что-либо записать в файл, при этом файл занят другим процессом, то этот поток блокируется, но в идеале, в обработчиках асинхронных событий не должно быть блокирующих операций вообще, иначе пулл потоков может уйти в режим ожидания и новые события некому будет обрабатывать

Я понял, что события/мьютексы мне не очень подходят, возможно я смогу переделать свой алгоритм так, что-бы состояние примитива синхронизации проверялось, но ожидания не происходило...

Существует ли какой-либо механизм синхронизации процессов, основный на обмене сообщениями между процессами?

Добавлено через 6 минут и 28 секунд
попробую уточнить, запись происходит так
- синхронизация процессов (блокирует поток на некоторое время)
- начало записи
...
- вызов обработчика окончания записи (освобождает файл, устанавливая событие)

между последним и первым пунктами, проходит достаточно много времени, все это время, поток другого процесса может быть заблокирован
PM MAIL Skype GTalk   Вверх
jonie
Дата 7.1.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата


Существует ли какой-либо механизм синхронизации процессов, основный на обмене сообщениями между процессами?
готового наверняка нет...ну, разве что на ум приходит MPI и подобное (это из раздела распределенные вычисления)...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
fry
Дата 8.1.2010, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Если я правильно понял, то:
Думаю алгоритм можно реализовать ....

если будет иметь место "связывание" файла (или некоторого их множества) с определенным потоком выполнения, при этом коллизии исключаются по определению, 

или 

если поток может отложить выполнение записи и "заняться" чем-нибудь другим.

Первый вариант на мой взгляд может быть интересен. Его реализация позволит исключить блокировку, при этом необходимо обеспечить сортировку заданий для потоков перед их выполнением. Правда возможен дисбаланс по нагрузке для потоков, но при небольшой доработке думаю можно и это компенсировать. Сразу скажу, сам так еще не делал, просто написал что первое в голову пришло.  smile 

Второй вариант вроде смахивает на классическое решение, но как я понял он тут не применим.

Цитата

разве что на ум приходит MPI и подобное (это из раздела распределенные вычисления)...

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

Цитата

Существует ли какой-либо механизм синхронизации процессов, основный на обмене сообщениями между процессами?

Думаю не совру если скажу, что сделать можно все, а вот имеет ли смысл пользоваться тем, что сделал вопрос.
Можно, например, создать систему передачи маркера, где каждый маркер будет представлять определенный файл и синхронизировать операции его касающиеся. При этом каждый процесс будет знать можно ли ему выполнять некоторое задание без необходимости блокировки или нет.

Это сообщение отредактировал(а) fry - 8.1.2010, 05:20
PM MAIL   Вверх
ksili
Дата 8.1.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(Lazin @  7.1.2010,  20:26 Найти цитируемый пост)
Существует ли какой-либо механизм синхронизации процессов, основный на обмене сообщениями между процессами?

А может сделать так?
В один файл пишет только один процесс, а все другие, скидывают ему сообщением WM_COPYDATA то, что надо им записать в тот же файл. Сообщения будут приходить в очередь по-любому по-очереди smile так что данные испортиться не должны. Но не надо в OnCopyData() сразу писать в файл, иначе будут задержки и та же блокировка (WM_COPYDATA вроде шлётся только через SendMessage, т.к. возвращает ответ отправителю). Надо помещать данные в буфер и по-быстренькому отвечать отправителю, чтобы он продолжал работать, а вывод в файл сделать в другом потоке того же процесса.

Может быть такое решение позволит вообще писать во все файлы из одного процесса, а все остальные будут скидывать ему в WM_COPYDATA ещё инфу о том, в какой именно файл писать.

Я сам так не делал, только сейчас придумал.

Это сообщение отредактировал(а) ksili - 8.1.2010, 10:28


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Lazin
Дата 8.1.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(fry @  8.1.2010,  04:06 Найти цитируемый пост)
если будет иметь место "связывание" файла (или некоторого их множества) с определенным потоком выполнения, при этом коллизии исключаются по определению, 
связывание с потоком невозможно, так как у меня есть несколько процессов, в одном процессе коллизий и так не происходит

Цитата(ksili @  8.1.2010,  08:34 Найти цитируемый пост)
В один файл пишет только один процесс, а все другие, скидывают ему сообщением WM_COPYDATA то, что надо им записать в тот же файл. 

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

реализовал так:
определяю что и куда нужно писать, далее вызываю WaitForSingleObject, с нулевым таймаутом. Если ресурс(файл) захвачен, то начинаю асинхронную запись в файл, иначе, вызываю PostQueuedCompletionStatus и передаю туда нужные параметры, далее, один из потоков(из пулла потоков) получит соответствующий пакет завершения и попытается повторить запись, в случае неудачи он опять ее(запись) отложит и тд
Это работает отлично.
PM MAIL Skype GTalk   Вверх
Dem_max
Дата 12.1.2010, 15:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



вот собственно почитай рихтера  (там в конце синхронизация потоков)  ОГЛАВЛЕНИЕ


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lazin
Дата 12.1.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Dem_max, 
во первых, я какбэ в курсе
во вторых, синхронизировать потоки не нужно, мне нужно синхронизировать асинхронные вызовы процедур, происходящие в разных процессах
в третьих, я уже нашел решение и написал об этом
кажется я начинаю подозревать, что ты не читал топик прежде чем всех просветить
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0946 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.