Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточное программирование : mutex, multithreaded programming lock resource 
:(
    Опции темы
lostam
Дата 19.2.2009, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Общий привет знатокам,

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

Итак... имеем главный процесс кот  берет команды из контейнера и посылает их через транспорт:

Код


void process(Commands&, Tr& transport)
    {
        transport.send(my_command_);
    }
 



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

Код


virtual void onReceivingResponse(Response_type& msg, sessionID&)
    {
    processResponse(container_ref , responseLine); 
    }





Нужно чтобы очередная команда не посылалась пока не обработаются ответы на предыдущую или  пока не истекает время ожидания . Условие, что ответы обработались выполняется,  если все ожидаемые резульатты помечены как полученные.

Вопрос: кто тут  должен быть muteх- транспорт или контейнер из которого берутся команды?  И как примерно за это взяться т. е. где правильно поставить lock, где unlock и как организовать дополнительный контроль  с использованием тimeout ? Я не знаю как установить начало отсчета, которое совпадает с посыланием команды.
 
Спасибо зараннее если кто-то поможет! 




 
PM MAIL   Вверх
jonie
Дата 19.2.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

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

Поток 1 : флаг=1, Производится отсылка (висит код где-то внутри неё).
В этоже время:
Поток 2: GetFlag(флаг, таймаут); Если Таймаут превышен - ошибка отсылки, поток отсылки залоченный. Можно попоробывать снова получить флаг.  ИНАЧЕ: Ставим флаг в 1, отсылаем. По окончании отсылки ставим флаг в нуль.

--------
А можно сделать совсем по другому: использовать что-то что уже будет само синхронизировать очередь отсылки. Этим "что-то" может быть очереди гарантированной доставки (например MSMQ), окона и их оконные сообщения (винда только?) (очередь организует винда в виде оконных сообщений - там делает, например, COM).
--------

к сожалению, вы не написали какую ОС вы используете - так что кодом помочь сложно... да и  полно его в гугле...


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


Новичок



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

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



Спасибо большое за ответ Jonie!  MSMQ, наверное, не годится так как процесс сделан в Uniх.
Кажется у них тут есть какая-то другая (своя)  система очередей которая  сливает все входящие потоки в один, буду дальше разбираться...может все не так сложно, но с непривычки мне даже читать готовый код довольно трудно, так что я не уверен, что правильно сформулировал свой вопрос. Пошел долбать дальше. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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