一,题目
网络上下载数据,然后存储到硬盘上。简单做法是:先下载一块然后写到硬盘,然后再下载,再写到硬盘上。
缺点:需要先下载完才能写入硬盘,下载和写是串行操作。
改进:让两个线程并行进行,设置缓冲区,采用信号量的形式。
下载线程,只要缓冲区有空余就下载,下载完成之后告诉写线程缓冲区有数据了。
写线程,只要缓冲区有数据就写入,写完后告诉下载线程缓冲区有空闲了。
二,核心源码
//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();
}
分享到:
相关推荐
双线程下载
无聊的时候写的一个双线程守护的整蛊小程序
双线MACD,mt4中的单线macd不同
2.内容:quartusii平台通过verilog编程实现bilinear双线性插值,将100x100图像进行插值处理 3.用处:用于bilinear双线性插值算法编程学习 4.指向人群:本科,硕士,博士等教研使用 5.运行注意事项: 工程路径...
macd的双线调节方法
MT4指标之双线MACD
java的双线程接力参考代码,学习参考用。。。
用于MT4的自动交易系统(即expert)中的MACD指标,原系统自带MACD是单线的,此源码是双线,符合中国人的习惯
java小程序,双线程接力,可以帮你更好学习java语言
双线程应用委托使之不能与主线程冲突 龟兔赛跑全部文件代码压缩包
双线性滞回模型,单自由度结构的地震时程分析
在虚拟机上用消息队列实现对话(双线程收发),即A<->B; 同时又可以复习多线程和信号捕捉
MATLAB 编程 关于刚度退化模型,clough双线性
STM32F407ZET+FreeRTOS双线程控制LED灯闪烁
MT5-MACD双线指标.zip
双线性插值算法及实现 VC图象编程 双线性插值算法及实现 VC图象编程 双线性插值算法及实现 VC图象编程
双线四色macd 适用于波段操作。 (Two-line four-color MACD with deviation indication. It is suitable for band operation.)
matlab_quartusii平台通过verilog编程实现bilinear双线性插值,将100x100图像进行插值处理_源码
利用双线性映射构建高效身份认证方案.pdf,
介绍了图像增强与放大的一些方法,比方说双线性插值法等