资源简介

实现多线程读写缓冲区的小例子。一个任务读文件并写入缓冲区,一个任务从缓冲区读内容写到文件,缓冲区可循环。读大文件请稍微改下缓冲区大小。

资源截图

代码片段和文件信息

#include 
#include “windows.h“
#include “conio.h“
#include “stdio.h“
#include “time.h“

char buff[20]={‘\0‘}; //缓冲区
int max = 20; //缓冲区大小
int wlog=0; //写指针
int rlog=0; //读指针
int sign=0; //文件读完停止标志
HANDLE g_hMutex; //互斥量

/*
 * 写入buffer接口
 * 每次写入一个字符
 */
void PutToBuffer(char *p)
{
WaitForSingleobject(g_hMutex INFINITE);
//写入缓冲区
buff[wlog]=*p;
//写的位置+1
if(wlog == (max-1))
wlog=0;
else
wlog++;
ReleaseMutex(g_hMutex);
}

/*
 * 读取buffer接口
 * 每次读一个字符
 * 读过的位置置0
 */
void GetBuffer()
{
//读,并且写入目标文件
WaitForSingleobject(g_hMutex INFINITE);
buff[rlog]=‘\0‘;

//写的位置+1
if(rlog == (max-1))
rlog=0;
else
rlog++;
ReleaseMutex(g_hMutex);
}

/*
 * 写buffer线程
 */
void write()
{
//打开文件
char ch; //每次读取的一个字节
FILE *fp = NULL;
if(!(fp = fopen(“a.txt““r“)))
printf(“打开源文件出错了!\n“);
else
{
//按字节读文件
while((ch = fgetc(fp))!=EOF )
{
//缓冲区写满,循环写追尾了的情况
while(wlog==rlog && buff[wlog]!=‘\0‘)
{
printf(“缓冲区满,写线程等待... ...\n“);
Sleep(500);
}
//写入缓冲区
PutToBuffer(&ch);
}
}
fclose(fp);
sign=0; //文件全部取完,更改标志,通知读线程
}

/*
 * 读buffer线程
 */
void read()
{
FILE *fp = NULL;
if(!(fp = fopen(“result.txt““w“)))
{
printf(“打开目标文件出错了!\n“);
}
else
{
while(1)
{
/* 当读写指针重合,两种可能
 * 一种:缓冲区空。等待写线程写入,或者已结束。
 * 一种:缓冲区满,读
 */
if(wlog==rlog && buff[rlog]==‘\0‘)
{
if(sign)
{
//没有结束,等待写线程写入
printf(“缓冲区空,文件还没有写完,读线程等待... ...\n“);
Sleep(1000);
}
else
{
//已经结束,无需等待了
printf(“\n -----完成!缓冲区空----- \n“);
break;
}
}
else
{
//读,并且写入目标文件
fputc(buff[rlog]fp);
GetBuffer();
}
}
}
fclose(fp);
}
int tStop()  
{
getch();                           
return 11;       
}
void main()
{
int m;
sign=1;
g_hMutex = CreateMutex(NULL FALSE NULL);

HANDLE ahThread=CreateThread(NULL0(LPTHREAD_START_ROUTINE)writeNULL0NULL);
Sleep(500);
HANDLE bhThread=CreateThread(NULL0(LPTHREAD_START_ROUTINE)readNULL0NULL);
m=tStop();
if(m==11)       
{
CloseHandle(ahThread);
CloseHandle(bhThread);
printf(“\n-----Close Thread Success-----\n“); 
}
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件         40  2015-08-18 10:36  多线程\multithread\a.txt

     文件     192586  2015-07-30 17:31  多线程\multithread\Debug\multithread.exe

     文件     207816  2015-07-30 17:31  多线程\multithread\Debug\multithread.ilk

     文件      17948  2015-07-30 17:31  多线程\multithread\Debug\multithread.obj

     文件     500736  2015-07-30 17:31  多线程\multithread\Debug\multithread.pdb

     文件          0  2015-08-06 09:42  多线程\multithread\Debug\result.txt

     文件     140288  2015-07-30 17:31  多线程\multithread\Debug\vc60.idb

     文件      77824  2015-07-30 17:31  多线程\multithread\Debug\vc60.pdb

     文件       2520  2015-07-30 17:31  多线程\multithread\multithread.cpp

     文件       3461  2015-07-30 17:28  多线程\multithread\multithread.dsp

     文件        528  2015-07-30 17:31  多线程\multithread\multithread.dsw

     文件      50176  2015-07-30 17:31  多线程\multithread\multithread.ncb

     文件      48640  2015-07-30 17:31  多线程\multithread\multithread.opt

     文件       1183  2015-07-30 17:31  多线程\multithread\multithread.plg

     文件          6  2015-07-30 17:31  多线程\multithread\result.txt

     目录          0  2015-08-06 09:06  多线程\multithread\Debug

     目录          0  2015-07-31 09:28  多线程\multithread

     目录          0  2015-08-06 09:43  多线程

----------- ---------  ---------- -----  ----

              1243752                    18


评论

共有 条评论