![]() |
|
Модераторы: bsa |
![]()
|
|
| lostam |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 6.2.2009 Репутация: нет Всего: нет |
Общий привет знатокам,
Нужно быстро разобраться с тем как работает muteх. Понимаю, что многопоточное программирование не для чайников, но мне нужно приделать небольшой кусок к существующему процессу и абсолютно не у кого спросить, а опыта на C++ около трех недель включая больничный Итак... имеем главный процесс кот берет команды из контейнера и посылает их через транспорт:
Каждый раз когда приходит ответ(ы) на запрос открывается новый поток, который эти ответы обрабатывает, сравнивает с тем что должно быть и записывает результат обратно в контейнер , в вектор ассоциированный с командой .
Нужно чтобы очередная команда не посылалась пока не обработаются ответы на предыдущую или пока не истекает время ожидания . Условие, что ответы обработались выполняется, если все ожидаемые резульатты помечены как полученные. Вопрос: кто тут должен быть muteх- транспорт или контейнер из которого берутся команды? И как примерно за это взяться т. е. где правильно поставить lock, где unlock и как организовать дополнительный контроль с использованием тimeout ? Я не знаю как установить начало отсчета, которое совпадает с посыланием команды. Спасибо зараннее если кто-то поможет! |
||||
|
|||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
попробую описать более подробно (флаг - состояние эвента\мутекса и т.п.): Поток 1 : флаг=1, Производится отсылка (висит код где-то внутри неё). В этоже время: Поток 2: GetFlag(флаг, таймаут); Если Таймаут превышен - ошибка отсылки, поток отсылки залоченный. Можно попоробывать снова получить флаг. ИНАЧЕ: Ставим флаг в 1, отсылаем. По окончании отсылки ставим флаг в нуль. -------- А можно сделать совсем по другому: использовать что-то что уже будет само синхронизировать очередь отсылки. Этим "что-то" может быть очереди гарантированной доставки (например MSMQ), окона и их оконные сообщения (винда только?) (очередь организует винда в виде оконных сообщений - там делает, например, COM). -------- к сожалению, вы не написали какую ОС вы используете - так что кодом помочь сложно... да и полно его в гугле... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| lostam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 6.2.2009 Репутация: нет Всего: нет |
Спасибо большое за ответ Jonie! MSMQ, наверное, не годится так как процесс сделан в Uniх.
Кажется у них тут есть какая-то другая (своя) система очередей которая сливает все входящие потоки в один, буду дальше разбираться...может все не так сложно, но с непривычки мне даже читать готовый код довольно трудно, так что я не уверен, что правильно сформулировал свой вопрос. Пошел долбать дальше. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |