嗨我发现文件的并发下载和发送方面存在一些问题。这是我的代码:
在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:我不能使用信号......
答案 0 :(得分:0)
好的我假设http部分正常工作,服务器可以接受多个请求,并且支持从到部分。现在只需进入你的线程,我看到你正在持有一个互斥对象:o。这本身使整个操作顺序(一次一个handlerRequest),因为一次只执行一个线程,这是你不想要的。整个代码块不需要线程安全,你怎么说?
你需要创建5个线程,其中有5个线程对象要等待,我不知道在Linux中用于此目的是什么,但是在Windows中你可以使用WaitForMultipleObjects,也许可以检查一下:
WaitForSingleObject and WaitForMultipleObjects equivalent in linux
通常在部分下载文件时,从服务器请求文件大小,在返回长度的磁盘上分配文件,从不同位置开始打开多个文件指针(在您的情况下为5),每个线程将使用其各自的文件指针写入该文件。一旦5个互斥体(或任何正确的线程对象)被释放,它将指示5个线程已经完成工作,然后SendData可以做它的事情。
我希望我在这里并非完全错误呵呵:)