-
大小: 210KB文件類(lèi)型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-06-12
- 語(yǔ)言: 其他
- 標(biāo)簽: 多線(xiàn)程??讀寫(xiě)??大文件??循環(huán)buffer??
資源簡(jiǎn)介
實(shí)現(xiàn)多線(xiàn)程讀寫(xiě)緩沖區(qū)的小例子。一個(gè)任務(wù)讀文件并寫(xiě)入緩沖區(qū),一個(gè)任務(wù)從緩沖區(qū)讀內(nèi)容寫(xiě)到文件,緩沖區(qū)可循環(huán)。讀大文件請(qǐng)稍微改下緩沖區(qū)大小。

代碼片段和文件信息
#include?
#include?“windows.h“
#include?“conio.h“
#include?“stdio.h“
#include?“time.h“
char?buff[20]={‘\0‘}; //緩沖區(qū)
int?max?=?20; //緩沖區(qū)大小
int?wlog=0; //寫(xiě)指針
int?rlog=0; //讀指針
int?sign=0; //文件讀完停止標(biāo)志
HANDLE?g_hMutex; //互斥量
/*
?*?寫(xiě)入buffer接口
?*?每次寫(xiě)入一個(gè)字符
?*/
void?PutToBuffer(char?*p)
{
WaitForSingleobject(g_hMutex?INFINITE);
//寫(xiě)入緩沖區(qū)
buff[wlog]=*p;
//寫(xiě)的位置+1
if(wlog?==?(max-1))
wlog=0;
else
wlog++;
ReleaseMutex(g_hMutex);
}
/*
?*?讀取buffer接口
?*?每次讀一個(gè)字符
?*?讀過(guò)的位置置0
?*/
void?GetBuffer()
{
//讀,并且寫(xiě)入目標(biāo)文件
WaitForSingleobject(g_hMutex?INFINITE);
buff[rlog]=‘\0‘;
//寫(xiě)的位置+1
if(rlog?==?(max-1))
rlog=0;
else
rlog++;
ReleaseMutex(g_hMutex);
}
/*
?*?寫(xiě)buffer線(xiàn)程
?*/
void?write()
{
//打開(kāi)文件
char?ch; //每次讀取的一個(gè)字節(jié)
FILE?*fp?=?NULL;
if(!(fp?=?fopen(“a.txt““r“)))
printf(“打開(kāi)源文件出錯(cuò)了!\n“);
else
{
//按字節(jié)讀文件
while((ch?=?fgetc(fp))!=EOF )
{
//緩沖區(qū)寫(xiě)滿(mǎn),循環(huán)寫(xiě)追尾了的情況
while(wlog==rlog?&&?buff[wlog]!=‘\0‘)
{
printf(“緩沖區(qū)滿(mǎn),寫(xiě)線(xiàn)程等待...?...\n“);
Sleep(500);
}
//寫(xiě)入緩沖區(qū)
PutToBuffer(&ch);
}
}
fclose(fp);
sign=0; //文件全部取完,更改標(biāo)志,通知讀線(xiàn)程
}
/*
?*?讀buffer線(xiàn)程
?*/
void?read()
{
FILE?*fp?=?NULL;
if(!(fp?=?fopen(“result.txt““w“)))
{
printf(“打開(kāi)目標(biāo)文件出錯(cuò)了!\n“);
}
else
{
while(1)
{
/*?當(dāng)讀寫(xiě)指針重合,兩種可能
?*?一種:緩沖區(qū)空。等待寫(xiě)線(xiàn)程寫(xiě)入,或者已結(jié)束。
?*?一種:緩沖區(qū)滿(mǎn),讀
?*/
if(wlog==rlog?&&?buff[rlog]==‘\0‘)
{
if(sign)
{
//沒(méi)有結(jié)束,等待寫(xiě)線(xiàn)程寫(xiě)入
printf(“緩沖區(qū)空,文件還沒(méi)有寫(xiě)完,讀線(xiàn)程等待...?...\n“);
Sleep(1000);
}
else
{
//已經(jīng)結(jié)束,無(wú)需等待了
printf(“\n?-----完成!緩沖區(qū)空-----?\n“);
break;
}
}
else
{
//讀,并且寫(xiě)入目標(biāo)文件
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“);?
}
}
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件?????????40??2015-08-18?10:36??多線(xiàn)程\multithread\a.txt
?????文件?????192586??2015-07-30?17:31??多線(xiàn)程\multithread\Debug\multithread.exe
?????文件?????207816??2015-07-30?17:31??多線(xiàn)程\multithread\Debug\multithread.ilk
?????文件??????17948??2015-07-30?17:31??多線(xiàn)程\multithread\Debug\multithread.obj
?????文件?????500736??2015-07-30?17:31??多線(xiàn)程\multithread\Debug\multithread.pdb
?????文件??????????0??2015-08-06?09:42??多線(xiàn)程\multithread\Debug\result.txt
?????文件?????140288??2015-07-30?17:31??多線(xiàn)程\multithread\Debug\vc60.idb
?????文件??????77824??2015-07-30?17:31??多線(xiàn)程\multithread\Debug\vc60.pdb
?????文件???????2520??2015-07-30?17:31??多線(xiàn)程\multithread\multithread.cpp
?????文件???????3461??2015-07-30?17:28??多線(xiàn)程\multithread\multithread.dsp
?????文件????????528??2015-07-30?17:31??多線(xiàn)程\multithread\multithread.dsw
?????文件??????50176??2015-07-30?17:31??多線(xiàn)程\multithread\multithread.ncb
?????文件??????48640??2015-07-30?17:31??多線(xiàn)程\multithread\multithread.opt
?????文件???????1183??2015-07-30?17:31??多線(xiàn)程\multithread\multithread.plg
?????文件??????????6??2015-07-30?17:31??多線(xiàn)程\multithread\result.txt
?????目錄??????????0??2015-08-06?09:06??多線(xiàn)程\multithread\Debug
?????目錄??????????0??2015-07-31?09:28??多線(xiàn)程\multithread
?????目錄??????????0??2015-08-06?09:43??多線(xiàn)程
-----------?---------??----------?-----??----
??????????????1243752????????????????????18
評(píng)論
共有 條評(píng)論