Одновременная загрузка файла с потоками - PullRequest
0 голосов
/ 27 января 2012

Привет! У меня проблемы с одновременной загрузкой и отправкой файла. это мой код:

в основном ()

while(1){
    while(i < wrapper->request_get->maxconnect && nconn < 5){
         wrapper->request_get->temp = i;
         i++;nconn++;
         if((pth=pthread_create(&id[i],NULL,thread_func,wrapper))!=0){
         ...
         ...
      }

, поэтому мне нужно загрузить общий файл с максимум 5 подключениями одновременно. переменные «i» и «nconn» являются глобальными и начинаются со значения 0.

в thread_func ():

    void *thread_func(void* args){
    pthread_mutex_lock(&mutex);
    j++;//it's global set to -1
    struct RequestWrapper *wr = args;
    ...
    ...//I set the range of data to request.
    ...//for example,thread #1 needs bytes from 1 to 100;#2 from 101 to 200 etc...
    ...//I do that with the value of "j".

    handlerRequest(wr)//this function asks(using a connect) to server a file's single part and save it
                      //into a buffer of struct wr.

    if(array[j]!=1){//if is not it my turn to send, wait
           pthread_cond_wait(&cond, &mutex);}

    SendData(wr)//send data conteined into a buffer of wr.
    array[j+1]=1;//I enable the next thread to send
    pthread_mutex_unlock(&mutex);
    pthread_cond_broadcast(&cond);//unlock other threads
nconn--;
pthread_exit(NULL);                 
}

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

thread#1 download---send---thread#2 download---send---etc etc

как я могу загрузить пять частей файла одновременно и затем отправить их упорядоченным образом, как только они будут готовы? Я новичок в потоках, поэтому я думаю, что некоторые неизвестные мне функции могут помочь мне, но какие? Ps: я не могу использовать сигнал ...

1 Ответ

0 голосов
/ 27 января 2012

Хорошо, я предполагаю, что http-часть работает нормально, и сервер может принимать несколько запросов, а промежуточные части поддерживаются. Теперь, просто входя в ваш поток, я вижу, что вы держите один объект мьютекса: o. Это само по себе делает всю операцию последовательной (по одному handlerRequest за раз), потому что одновременно выполняется только один поток, что вам не нужно. Весь блок кода не нуждается в безопасности потоков, что вы скажете?

Вам нужно создать 5 потоков с 5 объектами потока для ожидания, я не знаю, что для этого используется в Linux, но в Windows вы бы использовали WaitForMultipleObjects, возможно, проверьте это:

Экземпляры WaitForSingleObject и WaitForMultipleObjects в linux

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

Надеюсь, я не совсем ошибаюсь, хе-хе:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...