資源簡介
實現多線程讀寫緩沖區的小例子。一個任務讀文件并寫入緩沖區,一個任務從緩沖區讀內容寫到文件,緩沖區可循環。讀大文件請稍微改下緩沖區大小。

代碼片段和文件信息
#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
評論
共有 條評論