Как Организовать Многопоточное Приложение.

Тема в разделе "Общие вопросы по С и С++", создана пользователем alexdrob, 9 июн 2012.

Статус темы:
Закрыта.
  1. alexdrob

    alexdrob Гость

    Здравствуйте! Мне нужно сделать примерно следующцю структуру.

    Есть Тред в котором идёт опрос открытого сокета на новые конекты. (SocketAccept)

    Есть SocketManager, по сути просто содержит unordered_set<SocketThread*>. Он их создаёт, например 4, добавляет новые сокеты на прослушку в те треды, в которых меньше сокетов. Для сокета так же создаётся класс SocketClient и с функциями чтения и записи.

    Есть SocketThread каждый вобратбатывается в отдельном потоке, у них постоянно вызывается метод Update. В данном методе поток спит на epoll_wait, и как только появляется активность, для данного сокета вызывается функция SocketClient->onRead(sock).

    Сокеты не блокирующие и сколько данных прочитано, передаётся в EventManager EMgr->onRead(this, buff, len);

    EMgr это связка между сокетной частью и приложением FTP сервера. То есть я хочу сделать так, что бы не было в пакете Net привязки к конкретно ФТП. И если нужно то можно там что то другое сделать, например http сервер или сервер для чата со своим протоколом.

    EMgr отдаёт в FTP менеджер. Который в зависимости от ид сокета, вызывает в нужном объекте FTPSession функцию void FTPSession::appendData(char* b, int len)
    Там всё парсится и распознаётся команда. Она выполняется.

    FTPSession создаёт объект DataSession для канала данных. И вот он крутится в другом потоке. Там тоже есть несколько потоков, которые создаются FTPManager'ом. Они блокируются семафором.

    Как только добавлена новая команда, один из свободных потоков, забирает из очереди класс DataSession и вызывает в нём функцию Update.

    Во время отправки файла, буфер я сделал 1024 байта, за раз больше не отправит, что бы поток не работал с одним клиентом пока весь файл не отдаст, он по очереди переключается между разными клиентами. Так вот, беда в том, что бы правильно всё блокировать мьютексами, и откуда что удалять особенно при разрыве связи с сокетом клиента. Если канал данных активен, и оборвать связь, то сервер падает :(

    Вот тут можно посмотреть на то что я наделал https://bitbucket.org/rualex/ftp/src
    Понимаю что кода много и разбираться не каждый захочет, но может кто то и посмотрит, посоветует что :)
     
  2. alexdrob

    alexdrob Гость

    Вообщем переделал немного систему.
    Отладка показала что падает на
    Код (C++):
    Program received signal SIGPIPE, Broken pipe.
    Добавил
    Код (C++):
    signal(SIGPIPE, SIG_IGN);
    не помогло, всё арвно падает на этом же :rolleyes:
    Подскажите как поправить?
     
  3. alexdrob

    alexdrob Гость

    Не помогает только когда из под gdb запущено :rolleyes:
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей