![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
мне нужно записывать данные в большое количество файлов, асинхронно, причем несколько приложений могут писать данные в один и тот-же файл, я использую IOCP для организации неблокирующего I/O
что-бы не испортить данные, каждое приложение, перед тем, как записать что-либо, ждет именованное событие, после того, как запись окончена, приложение снова устанавливает это событие в signaled state теперь собственно проблема если один из потоков, входящих в пулл потоков, пытается что-либо записать в файл, при этом файл занят другим процессом, то этот поток блокируется, но в идеале, в обработчиках асинхронных событий не должно быть блокирующих операций вообще, иначе пулл потоков может уйти в режим ожидания и новые события некому будет обрабатывать Я понял, что события/мьютексы мне не очень подходят, возможно я смогу переделать свой алгоритм так, что-бы состояние примитива синхронизации проверялось, но ожидания не происходило... Существует ли какой-либо механизм синхронизации процессов, основный на обмене сообщениями между процессами? Добавлено через 6 минут и 28 секунд попробую уточнить, запись происходит так - синхронизация процессов (блокирует поток на некоторое время) - начало записи ... - вызов обработчика окончания записи (освобождает файл, устанавливая событие) между последним и первым пунктами, проходит достаточно много времени, все это время, поток другого процесса может быть заблокирован |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| fry |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: нет Всего: 3 |
Если я правильно понял, то:
Думаю алгоритм можно реализовать .... если будет иметь место "связывание" файла (или некоторого их множества) с определенным потоком выполнения, при этом коллизии исключаются по определению, или если поток может отложить выполнение записи и "заняться" чем-нибудь другим. Первый вариант на мой взгляд может быть интересен. Его реализация позволит исключить блокировку, при этом необходимо обеспечить сортировку заданий для потоков перед их выполнением. Правда возможен дисбаланс по нагрузке для потоков, но при небольшой доработке думаю можно и это компенсировать. Сразу скажу, сам так еще не делал, просто написал что первое в голову пришло. Второй вариант вроде смахивает на классическое решение, но как я понял он тут не применим.
Дело-то не в распараллеливании вычислений, а в синхронизации обработки без необходимости блокировки. В принципе, если пользоваться технологиями распределенных вычислений, то поддерживающая их система (MPI, PVM или еще что) скорее всего не реализует эту функциональность (просто смысл у нее другой) и как бы затраты на ее работу(передача по сети или межпроцессное взаимодействие) не свели все "плюсы" на нет в отношении производительности.
Думаю не совру если скажу, что сделать можно все, а вот имеет ли смысл пользоваться тем, что сделал вопрос. Можно, например, создать систему передачи маркера, где каждый маркер будет представлять определенный файл и синхронизировать операции его касающиеся. При этом каждый процесс будет знать можно ли ему выполнять некоторое задание без необходимости блокировки или нет. Это сообщение отредактировал(а) fry - 8.1.2010, 05:20 |
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
А может сделать так? В один файл пишет только один процесс, а все другие, скидывают ему сообщением WM_COPYDATA то, что надо им записать в тот же файл. Сообщения будут приходить в очередь по-любому по-очереди Может быть такое решение позволит вообще писать во все файлы из одного процесса, а все остальные будут скидывать ему в WM_COPYDATA ещё инфу о том, в какой именно файл писать. Я сам так не делал, только сейчас придумал. Это сообщение отредактировал(а) ksili - 8.1.2010, 10:28 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
это будет крайне неэффективно, синхронная обработка сообщений тут не будет работать, я использую неблокирующий/асинхронный IO по одной простой причине - нужно обрабатывать очень много информации, обычно у меня идет запись на скорости - близкой к максимальной скорости записи жесткого диска реализовал так: определяю что и куда нужно писать, далее вызываю WaitForSingleObject, с нулевым таймаутом. Если ресурс(файл) захвачен, то начинаю асинхронную запись в файл, иначе, вызываю PostQueuedCompletionStatus и передаю туда нужные параметры, далее, один из потоков(из пулла потоков) получит соответствующий пакет завершения и попытается повторить запись, в случае неудачи он опять ее(запись) отложит и тд Это работает отлично. |
||||
|
|||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
вот собственно почитай рихтера (там в конце синхронизация потоков) ОГЛАВЛЕНИЕ
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Dem_max,
во первых, я какбэ в курсе во вторых, синхронизировать потоки не нужно, мне нужно синхронизировать асинхронные вызовы процедур, происходящие в разных процессах в третьих, я уже нашел решение и написал об этом кажется я начинаю подозревать, что ты не читал топик прежде чем всех просветить |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |