Форум программистов, компьютерный форум CyberForum.ru

Уменьшить нагрузку потока - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Прошу составить схему в решении программы на С++ http://www.cyberforum.ru/cpp-beginners/thread601699.html
Напишите программу вычисления интеграла f(x)=5x<< x в квадрате-x+2 методом прямоугольников
C++ как освободить только первый элемент массива, не трогая остальные? Есть код: int *ptr; ptr = (int*)calloc(10, sizeof(int)); собственно вопрос: как освободить только первый элемент массива? не трогая остальные http://www.cyberforum.ru/cpp-beginners/thread601647.html
C++ Используя поиск в ширину в графе выделить связаные копоненты неориентированного графа
Вот поиск в ширину кратчайшего рсстояния. А как его переделать что бы выделяло компоненты неориентированного графа. Вообще незнаю как помогите пожалуйста. //--------------------------------------------------------------------------- #pragma hdrstop #include <vector> #include <stdio.h> #include <queue> #include <iostream>...
C++ Описать структуру с именем AEROFLOT
Описать структуру с именем AEROFLOT , содержащую следующие поля: * название пункта назначения рейса; * номер рейса; * тип самолета; Написать программу, выполняющую следующие действия: * ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения; * вывод на экран пунктов назначения и...
C++ Задача на файлы http://www.cyberforum.ru/cpp-beginners/thread601625.html
1. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Дан файл Bagazh, содержащий сведения о багаже нескольких пассажиров. Сведения о багаже каждого пассажира представляют собой запись с двумя полями: одно поле целого типа (количество вещей) и одно — действительное (вес в кило-граммах). Найти багаж, средний вес одной вещи в котором отличается не более чем на 0,3 кг от общего...
C++ Численно убедится есть ли заданная функция парной или непарной Численно убедится есть ли заданная функция y = f (x) парной или непарной на заданном отрезке . Высчитать ошибку вычисления и возможные точки разрыва функции. Проверить, например для функций y = x^4, y = tg x, y = e^x выполняя их вычисления на отрезке с шагом 0.1 ( парность - это четность ) Пожалуйста помогите с задачей я в тупике=( bool pair = true; for (double x=0; x<5; x += 0.1) if... подробнее

Показать сообщение отдельно
DrobyshevAlex
1164 / 1114 / 16
Регистрация: 31.05.2012
Сообщений: 3,059
09.06.2012, 23:14     Уменьшить нагрузку потока
Делаю многопоточный сервер.
Клиенты подключаются, парсится команда и дальше она отдаётся в очередь.

Создаётся несокль потоков. Все висят на семафоре. Как только добавилась команда, добаляется симафор, и какой то из потоков забирает из очереди класс клиента.
В нём вызывается функция Update.
Так как это ФТП сервер, и может передаваться файл, я сделал отправку и приём частами, на данный момент по 1024 байта.
То есть отдаю 1024 байта или принимаю, и если операция не закончена, то функция Update возвращает false и поток опять становится в очередь. Семафор опять увеличивается на 1.
Дальше опять какой то поток берёт клиента и опять всё по кругу.

Так вот, когда идёт приём или передача файла, получается что приложение начинает тратить 99ю9 процента процессора.
И если в этот момент пытаться вторым соеденением пользоваться - всё очень сильно тормозит...

Вот функция которая крутится в отдельном потоке.
C++
1
2
3
4
5
6
7
8
9
10
11
void FTPThread::Update()
{
    sem_wait(&FTP->sem);
    //Log->Print(LOG_DEBUG, "FTPThread::Update()");
    
    int sock = FTP->getNextQueue();
    FTPSession * ses = FTP->getSession(sock);
    
    if (ses != NULL && ses->Update())
        FTP->addQueue(sock);
}
Вот добавление и удаление в очередь клиентов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void FTPManager::addQueue(int sock)
{
    //Log->Print(LOG_DEBUG, "FTPManager::addDataQueue");
    queue.push(sock);
    sem_post(&FTP->sem);
}
 
int FTPManager::getNextQueue()
{
    //Log->Print(LOG_DEBUG, "FTPManager::getNextData");
    Lock();
    int sock = 0;
    if (!queue.empty())
    {
        sock = queue.front();
        queue.pop();
    }
    UnLock();
    return sock;
}
Тут выполняется команда клиента за 1 раз, если есть. И в конце идёт вызов функции для канала данных.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
bool FTPSession::Update()
{
    if (!commands.empty())
    {
        Command * c = commands.front();
        commands.pop();
        if (Handler * h = FTPProtocol::getCommands(c->command.c_str()))
        {
            if (h->flag == 0 || isAuth())
            {
                (*this.*h->handler)(c);
            }
            else
            {
                if (Reply * reply = FTPProtocol::getReply(FTPProtocol::ACCESS_DENIED))
                {
                    send(reply->reply);
                }
            }
        }
    }
    return !data_session->Update();
}
 
bool DataSession::Update()
{
    //Log->Print(LOG_DEBUG, "DataSession::Update");
    
    if (!commands.empty())
    {
        Command * c = commands.front();
        if (c->command == "LIST")
        {
            if (sendList())
            {
                commands.pop();
            }
        }
        else if (c->command == "STOR")
        {
            if ((isConnected() || fp != NULL) && storFile(c))
            {
                Log->Print(LOG_DEBUG, "DataSession::STOR END");
                commands.pop();
            }
        }
        
        else if (isConnected() && c->command == "RETR")
        {
            if (retrFile(c))
            {
                commands.pop();
            }
        }
    }
 
    return commands.empty();
}
То есть когда клиент подключен, но нет команд не выполненых, тогда всё отлично, а вот когда выполняется команда, всё ужасно виснит.
Как можно исправить ситуацию?)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru