|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
03.12.2016, 10:39 | #1 |
Пользователь
Регистрация: 16.08.2010
Сообщений: 13
|
Inter-process communication
Приветствую. Занялся изучением Inter-process communication.
Цель написать программу для синхронизации 3 процессов (не потоков в 1 процессе). Суть программы должна быть такой: запускается 3 процесса. каждый из процессов, кроме последнего, ждёт пока все процессы-соседи запишут данные в общую память. последний из записавших отправляет сигнал процессам-соседям продолжать. код программы создающей общую память: Код:
Код:
1) когда все три процесса начинают ждать-соседей. 2) происходит рассинхронизация в данных процессов (переменная count). Прошу помощи. Что я делаю не так? почему такие ситуации возникают? ниже ссылка на скриншот консоли. https://yadi.sk/i/jf4Sh5dy325FGd Последний раз редактировалось FatalLight; 03.12.2016 в 10:41. Причина: не добавил ссылку на скриншот |
03.12.2016, 13:57 | #2 |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
Добавь логгирование и посмотри последовательность работы процессов.... это так, универсальное решение))
в код вникать лень, но какой-то он странный.... родительский процесс создаёт шару и вырубается, не ожидая окончания работы... дочерные процессы какие-то там флаги смотрят, хотя есть же объекты синхронизации... и какое-то оно переусложнённое) |
03.12.2016, 17:06 | #3 | |
Заблокирован
Регистрация: 29.11.2016
Сообщений: 215
|
Возьмите вот эту книжку:
Цитата:
И будет вам счастье ... - а природе нет лучше описания по IPC. P.S. Никто, конечно, рыться в вашем громоздком коде не станет. |
|
03.12.2016, 17:09 | #4 | |
Заблокирован
Регистрация: 29.11.2016
Сообщений: 215
|
Цитата:
2. организовывать межпроцессное взаимодействие через shared memory - это одно из самых худших решений из всех, какие только можно придумать. |
|
03.12.2016, 19:14 | #5 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Ну что же так категорично ))
По сабжу - двойная блокировка. Допустим первый процесс сделал Код:
Код:
И тут отвисает самый первый и делает pthread_cond_wait(&(p_shmem->cond), &(p_shmem->cond_mutex));// остановить процесс до получения сигнала от соседнего процесса. Чтобы процесс продолжил работать, другим процессам нужно сделать Код:
Короче, нельзя использовать разные методы синхронизации внутри друг друга. Блокировка по той же причине Последний раз редактировалось eoln; 03.12.2016 в 19:19. |
06.12.2016, 13:09 | #6 |
Пользователь
Регистрация: 16.08.2010
Сообщений: 13
|
Раз никто не помог конкретным решением, никто не захотел разбираться в коде.
Ниже приведу своё решение, авось кому-нибудь да понадобится (больше нет рассинхронизации данных и процессы не встают в ожидание): Код:
|
06.12.2016, 13:42 | #7 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Не можно )).
Между Код:
Код:
Снижена вероятность такой ситуации, но всего лишь СНИЖЕНА, а не исключена. Я вот, например, не боюсь в грозу по улице ходить, хотя https://youtu.be/XXgZSd4fjn8?t=64 Смотри в сторону семафоров, это такой же ядрёный объект, только ещё и количество процессов регулирует (на случай если соседей будет не 2, а 23). |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вылетаю после inter'a | Carn | Общие вопросы C/C++ | 4 | 23.03.2010 23:58 |
(process.h) Компилятор говорит Process не объявлен | Парсифаль | Общие вопросы C/C++ | 0 | 15.02.2010 00:27 |
Wireless Communication Devices | fize | Помощь студентам | 1 | 05.01.2010 16:09 |
Триггеры в Inter Base 7.0 | Claster | БД в Delphi | 9 | 13.05.2009 18:10 |