Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2011, 22:55   #1
Once
Пользователь
 
Регистрация: 21.08.2011
Сообщений: 14
По умолчанию Класс для использования потоков

Начал разбираться в многопоточных программках для линукса и возникли проблемки по реализации, точнее не пойму саму логику их распараллеливания. Для практики начал писать небольшой класс, в который подаётся количество потоков, функция, которая по ним разойдётся и значение буфера. При этом я возвращаю значение из функции с помощью pthread_join - это ответ на запрос, но подозреваю что потоки у меня создаются и работают не параллельно, а как бы по очереди ) то есть ждут окончания предыдущего.. как это исправить? Вот то что я написал на данный момент.. хотелось бы услышать полезные комментарии, рекомендации к коду, чего не хватает, как будет правильней.. )
Код:
#include <stdlib.h>
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
 
#define HOST_NAME "77.88.21.3" 
#define PORT 80
 
typedef void *(func_for_thread)(void *);
 
class TThread{
        private:
                pthread_t *thread;
                int num;
                int *id;
                int count;
                void *buffer;
        public:
                TThread();
                ~TThread();
                template <typename Type>
                Type Execute(int, func_for_thread, int);
};
 
TThread::TThread()
{
        thread = (pthread_t *)malloc(sizeof(pthread_t) * num);
        id = (int *)malloc(sizeof(int) * num);  
}
 
TThread::~TThread()
{
        free(thread);
        free(id);
        free(buffer);
}
 
template <class Type>
Type TThread::Execute(int number, func_for_thread func, int size_of_buf)
{
        num = number;
        buffer = (Type *)malloc(sizeof(Type) * size_of_buf);
        for (count = 0, id[0] = 0; count < num; count++, id[count] = count){
                id[count] = count;
                try{
                        pthread_create(&thread[count], NULL, func, &id[count]);
                        pthread_join(thread[count], &buffer);
                }
                catch (...){
                        std::cout << "Thread " << count + 1 << ": Create error" << std::endl;
                        continue;
                }
                sleep(0.3);
        }
        return (Type)buffer;
}
 
void *query(void *arg)
{
        int loc_id = *(int *)arg;
        printf("Thread %i is running\n", loc_id + 1);
        char message[] = {
                                 "GET / HTTP/1.1\r\n"
                                 "Host: myip.yandex.ru\r\n"
                                 "User-Agent: Mozilla/5.0\r\n"
                                 "Accept: text/html\r\n"
                                 "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
                                 "Accept-Charset: windows-1251,utf-8;q=0.7\r\n"
                                 "Connection: keep-alive\r\n\r\n"
                                 };
        static char buffer[5000];
        int sock;
        struct sockaddr_in addr;
        struct hostent* raw_host;
        try{
                raw_host = gethostbyname(HOST_NAME);
                sock = socket(AF_INET, SOCK_STREAM, 0);
                addr.sin_family = AF_INET;
                addr.sin_port = htons(PORT);
                addr.sin_addr.s_addr = ((struct in_addr *)raw_host->h_addr_list[0])->s_addr;
                connect(sock, (struct sockaddr *)&addr, sizeof(addr));
                send (sock, message, sizeof(message), 0);
                recv (sock, buffer, sizeof(buffer), 0);
                close(sock);
        }
        catch (...){
                std::cout << "Socket error" << std::endl;
                return NULL;
        }
        return buffer;
}
 
int main()
{       
        TThread MyThread;
        std::cout << MyThread.Execute<char*>(5, query, 5000) << std::endl;
        return EXIT_SUCCESS;
}

Последний раз редактировалось Once; 10.09.2011 в 22:37.
Once вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
установка приоритетов для потоков session Общие вопросы C/C++ 8 23.06.2010 10:17
установка приоритетов для потоков session Общие вопросы C/C++ 2 21.06.2010 18:11
Компонент для использования справки zmey31313 Компоненты Delphi 3 30.11.2009 08:31
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40
Глобальны переменные для потоков PM85 Общие вопросы C/C++ 3 15.04.2008 18:12