编程之美--双线程高效下载
来源:互联网 发布:淘宝联盟返现到哪里 编辑:程序博客网 时间:2024/04/28 00:37
一,题目
网络上下载数据,然后存储到硬盘上。简单做法是:先下载一块然后写到硬盘,然后再下载,再写到硬盘上。
缺点:需要先下载完才能写入硬盘,下载和写是串行操作。
改进:让两个线程并行进行,设置缓冲区,采用信号量的形式。
下载线程,只要缓冲区有空余就下载,下载完成之后告诉写线程缓冲区有数据了。
写线程,只要缓冲区有数据就写入,写完后告诉下载线程缓冲区有空闲了。
二,核心源码
- //downloads a block from Internet sequentially in each call
- //return true, if the entire file is downloaded, otherwise false.
- bool GetBlockFromNet(Block* out_block);
- //writes a block to hard disk
- bool WriteBlockToDisk(Block* in_block);
- class Thread
- {
- public:
- Thread(void (*work_func)());
- ~Thread();
- void Start();
- void Abort();
- };
- class Semaphore
- {
- public:
- Semaphore(int count,int max_count);
- ~Semaphore();
- void Unsignal();
- void Signal();
- };
- class Mutex
- {
- public:
- WaitMutex();
- ReleaseMutex();
- };
- //----------------------------------------------------
- //1.确定使用信号量,而非互斥量,保证并行操作
- //2.当缓冲区并不满并且下载没结束时,下载线程运行
- //3.当缓冲区并不空并且下载没结束时,存储线程运行
- #define MAX_COUNT 1000
- Block g_Buffer[MAX_COUNT]; //缓冲区数组,模拟循环队列
- Thread g_Download(ProcA);
- Thread g_Write(ProcB);
- //一开始缓冲区空间为MAX_COUNT,整个缓冲区可供下载的数据填充
- Semaphore ForDownload(MAX_COUNT,MAX_COUNT);
- //一开始缓冲区无数据可供存储
- Semaphore ForWrite(0,MAX_COUNT);
- //下载任务是否完成
- bool isDone;
- //下载的数据从缓冲区的哪个地方开始填充
- int in_index;
- //存储的数据从缓冲区的哪个地方开始提取
- int out_index;
- void ProcA()//下载线程
- {
- while(true)
- {
- //首先取得一个空闲空间,以便下载数据填充
- ForDownload.Unsignal();
- //填充
- isDone=GetBlockFromNet(g_Buffer+in_index);
- //更新索引
- in_index=(in_index+1)%MAX_COUNT;
- //提示存储线程可以工作
- ForWrite.Signal();
- //当任务全部下载完成,进程就可以结束了
- if(isDone)
- break;
- }
- }
- void ProcB()//写入线程
- {
- while(true)
- {
- //查询时候有数据可供存储
- ForWrite.Unsignal();
- //存储
- WriteBlockToDisk(g_Buffer+out_index);
- //更新索引
- out_index=(out_index+1)%MAX_COUNT;
- //将空闲空间还给缓冲区
- ForDownload.Signal();
- //当任务全部下载完成,并且所有的数据都存储到硬盘中,进程才可以结束
- if(isDone&&in_index==out_index)
- break;
- }
- }
- int main()
- {
- isDone=false;
- in_index=0;
- out_index=0;
- g_Download.Start();
- g_Write.Start();
- }
0 0
- 【编程之美】双线程高效下载
- 编程之美--双线程高效下载
- 编程之美---双线程高效下载
- 读书笔记之编程之美 - 1.10 双线程高效下载
- 编程之美——双线程高效下载
- [编程之美] PSet1.10 双线程高效下载
- 编程之美:第一章 1.10双线程高效下载
- 编程之美-双线程高效下载方法整理
- 双线程高效下载问题
- 1.10 双线程高效下载
- 编程之美下载地址
- 编程之美之高效安排见面会
- 《编程之美》介绍和pdf下载
- 重新开始战斗07-编程之美-高效见面会
- 架构之美下载
- [编程之美]设计一个高效的数据结构,尽可能快的返回队列中的最大值
- HDU 1157 中位数有更高效的方法,编程之美又提到,以后实践
- 推荐《编程之美》
- MFC学习心得【滚动条的实现】
- 排序算法(C实现)---------- 折半插入排序
- 判断MYSQL语句执行结果
- LeetCode 70 Remove Duplicates from Sorted List
- 气功内景现象浅析
- 编程之美--双线程高效下载
- 接口测试方法
- 设置JDesktopPane背景图片
- Big Size brown film faced plywood Longda Wood koxa
- 数据库与数据仓库的区别
- 操作系统之进程
- 4399 仿作经验
- OSX10.9 MYSQL5.6安装
- 基于TCP的服务器和客户端的简单收发Demo