资源简介
实现多线程读写缓冲区的小例子。一个任务读文件并写入缓冲区,一个任务从缓冲区读内容写到文件,缓冲区可循环。读大文件请稍微改下缓冲区大小。
代码片段和文件信息
#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
相关资源
- 易语言多线程支持库2.1含静态库
- linux c tcp socket 多线程简易聊天室
- windows下多线程编程完成矩阵乘法
- 大学英语 读写教程课后习题答案1-4册
- 简单实现多线程同步模拟购票系统
- SPI 读写SD卡 程序可以直接使用
- 西门子PLC数据读写测试工具
- ExampleCode_RDC_AD2S1210官方例程内含模拟
- 基于mongoose实现Http Server多线程
- linux下使用IIC总线读写EEPROM
- STM32 F103R6 寄存器方式读写GPIO源代码
- 多线程安全链表操作的C程序
- 自己编写的使用Verilog通过SPI读写EEP
- 使用TCPServer编写多线程socket服务
- QT窗口界面模拟生产者消费者
- 最完美的STM32读写I2C EEPROM驱动
- linux下读写ini文件方法,可直接用
- Qt 多线程使用 QTcpSocket及QTimer
- Delphi XE 8 采用PosixAPI标准函数实现串口
- EEProm存储器AT24C02读写程序
- 内存映射读写文件的方法
- 读写I2C FLASH的Verilog程序
- rfid读写器设计与研究
- 多线程头文件omp.h
- 8051CF340读写DAC121S101程序,亲测,可用
- RC522单片机读写卡程序
- neie读写译视听说
-
xm
l增删改查 不用数据库,直接用 - STM32 IIC软件模拟读写24C02
- 读写锁实现
评论
共有 条评论