使用线程同时下载文件

时间:2012-01-27 01:10:53

标签: c multithreading concurrency

嗨我发现文件的并发下载和发送方面存在一些问题。这是我的代码:

在main()

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){
         ...
         ...
      }

所以我需要一次下载一个max 5连接的通用文件。变量&#34; i&#34;和&#34; nconn&#34;是全球性的,从价值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 :(得分:0)

好的我假设http部分正常工作,服务器可以接受多个请求,并且支持从到部分。现在只需进入你的线程,我看到你正在持有一个互斥对象:o。这本身使整个操作顺序(一次一个handlerRequest),因为一次只执行一个线程,这是你不想要的。整个代码块不需要线程安全,你怎么说?

你需要创建5个线程,其中有5个线程对象要等待,我不知道在Linux中用于此目的是什么,但是在Windows中你可以使用WaitForMultipleObjects,也许可以检查一下:

WaitForSingleObject and WaitForMultipleObjects equivalent in linux

通常在部分下载文件时,从服务器请求文件大小,在返回长度的磁盘上分配文件,从不同位置开始打开多个文件指针(在您的情况下为5),每个线程将使用其各自的文件指针写入该文件。一旦5个互斥体(或任何正确的线程对象)被释放,它将指示5个线程已经完成工作,然后SendData可以做它的事情。

我希望我在这里并非完全错误呵呵:)