双缓冲的誉抄的过程
2016-06-01 19:28
323 查看
程序一利用双缓冲、三线程的串行执行实现从输入文件到屏幕的拷贝输出:
代码如下:
#include<windows.h>
#include<iostream>
using namespacestd;
FILE *infile;
char buf1,buf2;
void get(){buf1=fgetc(infile);}
void copy(){buf2=buf1;}
void put( ){putchar(buf2);}
int main()
{
infile=fopen("in.txt","r");
for(;buf1!=EOF;)
{
get();
copy();
put();
}
fclose(infile);
return 0;
}
程序二实现线程的随机并发执行:
代码如下:
#include <cstdio>
#include "conio.h"
#include "windows.h"
#include <iostream>
using namespace std;
typedef struct _THREADDATA
{
FILE*infile;
char*buf1;
char*buf2;
}*LPTHREADDATA, THREADDATA;
DWORD WINAPI get(LPVOID lParam)
{
LPTHREADDATA pData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
*pData->buf1=fgetc(pData->infile);
Sleep(1);
}
return 0;
}
DWORD WINAPI copy(LPVOID lParam)
{
LPTHREADDATA pData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
*pData->buf2=*pData->buf1;
return0;
}
DWORD WINAPI put(LPVOID lParam)
{
LPTHREADDATA pData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
cout<<*pData->buf2<<endl;
Sleep(1);
}
return 0;
}
int main()
{
FILE*infile=fopen("in.txt","r");
charbuf1,buf2;
LPTHREADDATA pData = new THREADDATA;
pData->infile=infile;
pData->buf1=&buf1;
pData->buf2=&buf2;;
DWORD ThreadId1,ThreadId2,ThreadId3;
::CreateThread(NULL,0, get, (LPVOID)pData, 0, &ThreadId1);
::CreateThread(NULL,0, copy, (LPVOID)pData, 0, &ThreadId2);
::CreateThread(NULL,0, put, (LPVOID)pData, 0, &ThreadId3);
getch();
fclose(infile);
return0;
}
程序三控制进程实现正确的并发誊抄:
代码如下:
#include <cstdio>
#include "conio.h"
#include "windows.h"
#include <iostream>
using namespace std;
HANDLE Mutex;
HANDLE buf1_e;
HANDLE buf1_f;
HANDLE buf2_e;
HANDLE buf2_f;
typedef struct _THREADDATA
{
FILE*infile;
char*buf1;
char*buf2;
}*LPTHREADDATA, THREADDATA;
DWORD WINAPI get(LPVOID lParam)
{
LPTHREADDATApData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
WaitForSingleObject(buf1_e,INFINITE);
*pData->buf1=fgetc(pData->infile);
ReleaseSemaphore(buf1_f,1,NULL);
}
return 0;
}
DWORD WINAPI copy(LPVOID lParam)
{
LPTHREADDATApData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
WaitForSingleObject(buf1_f,INFINITE);
WaitForSingleObject(buf2_e,INFINITE);
*pData->buf2=*pData->buf1;
ReleaseSemaphore(buf1_e,1,NULL);
ReleaseSemaphore(buf2_f,1,NULL);
}
return 0;
}
DWORD WINAPI put(LPVOID lParam)
{
LPTHREADDATApData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
WaitForSingleObject(buf2_f,INFINITE);
cout<<*pData->buf2;
ReleaseSemaphore(buf2_e,1,NULL);
}
return 0;
}
int main()
{
// Mutex=CreateMutex(NULL,FALSE,NULL);
buf1_e=CreateSemaphore(NULL,1,1,NULL);
buf1_f=CreateSemaphore(NULL,0,1,NULL);
buf2_e=CreateSemaphore(NULL,1,1,NULL);
buf2_f=CreateSemaphore(NULL,0,1,NULL);
FILE*infile=fopen("in.txt","r");
charbuf1,buf2;
LPTHREADDATA pData = new THREADDATA;
pData->infile=infile;
pData->buf1=&buf1;
pData->buf2=&buf2;
DWORDThreadId1,ThreadId2,ThreadId3;
::CreateThread(NULL,0, copy, (LPVOID)pData, 0, &ThreadId2);
::CreateThread(NULL,0, put, (LPVOID)pData, 0, &ThreadId3);
::CreateThread(NULL,0, get, (LPVOID)pData, 0, &ThreadId1);
getch();
fclose(infile);
return 0;
}
代码如下:
#include<windows.h>
#include<iostream>
using namespacestd;
FILE *infile;
char buf1,buf2;
void get(){buf1=fgetc(infile);}
void copy(){buf2=buf1;}
void put( ){putchar(buf2);}
int main()
{
infile=fopen("in.txt","r");
for(;buf1!=EOF;)
{
get();
copy();
put();
}
fclose(infile);
return 0;
}
程序二实现线程的随机并发执行:
代码如下:
#include <cstdio>
#include "conio.h"
#include "windows.h"
#include <iostream>
using namespace std;
typedef struct _THREADDATA
{
FILE*infile;
char*buf1;
char*buf2;
}*LPTHREADDATA, THREADDATA;
DWORD WINAPI get(LPVOID lParam)
{
LPTHREADDATA pData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
*pData->buf1=fgetc(pData->infile);
Sleep(1);
}
return 0;
}
DWORD WINAPI copy(LPVOID lParam)
{
LPTHREADDATA pData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
*pData->buf2=*pData->buf1;
return0;
}
DWORD WINAPI put(LPVOID lParam)
{
LPTHREADDATA pData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
cout<<*pData->buf2<<endl;
Sleep(1);
}
return 0;
}
int main()
{
FILE*infile=fopen("in.txt","r");
charbuf1,buf2;
LPTHREADDATA pData = new THREADDATA;
pData->infile=infile;
pData->buf1=&buf1;
pData->buf2=&buf2;;
DWORD ThreadId1,ThreadId2,ThreadId3;
::CreateThread(NULL,0, get, (LPVOID)pData, 0, &ThreadId1);
::CreateThread(NULL,0, copy, (LPVOID)pData, 0, &ThreadId2);
::CreateThread(NULL,0, put, (LPVOID)pData, 0, &ThreadId3);
getch();
fclose(infile);
return0;
}
程序三控制进程实现正确的并发誊抄:
代码如下:
#include <cstdio>
#include "conio.h"
#include "windows.h"
#include <iostream>
using namespace std;
HANDLE Mutex;
HANDLE buf1_e;
HANDLE buf1_f;
HANDLE buf2_e;
HANDLE buf2_f;
typedef struct _THREADDATA
{
FILE*infile;
char*buf1;
char*buf2;
}*LPTHREADDATA, THREADDATA;
DWORD WINAPI get(LPVOID lParam)
{
LPTHREADDATApData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
WaitForSingleObject(buf1_e,INFINITE);
*pData->buf1=fgetc(pData->infile);
ReleaseSemaphore(buf1_f,1,NULL);
}
return 0;
}
DWORD WINAPI copy(LPVOID lParam)
{
LPTHREADDATApData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
WaitForSingleObject(buf1_f,INFINITE);
WaitForSingleObject(buf2_e,INFINITE);
*pData->buf2=*pData->buf1;
ReleaseSemaphore(buf1_e,1,NULL);
ReleaseSemaphore(buf2_f,1,NULL);
}
return 0;
}
DWORD WINAPI put(LPVOID lParam)
{
LPTHREADDATApData = (LPTHREADDATA)lParam;
for (;*pData->buf1!=EOF;)
{
WaitForSingleObject(buf2_f,INFINITE);
cout<<*pData->buf2;
ReleaseSemaphore(buf2_e,1,NULL);
}
return 0;
}
int main()
{
// Mutex=CreateMutex(NULL,FALSE,NULL);
buf1_e=CreateSemaphore(NULL,1,1,NULL);
buf1_f=CreateSemaphore(NULL,0,1,NULL);
buf2_e=CreateSemaphore(NULL,1,1,NULL);
buf2_f=CreateSemaphore(NULL,0,1,NULL);
FILE*infile=fopen("in.txt","r");
charbuf1,buf2;
LPTHREADDATA pData = new THREADDATA;
pData->infile=infile;
pData->buf1=&buf1;
pData->buf2=&buf2;
DWORDThreadId1,ThreadId2,ThreadId3;
::CreateThread(NULL,0, copy, (LPVOID)pData, 0, &ThreadId2);
::CreateThread(NULL,0, put, (LPVOID)pData, 0, &ThreadId3);
::CreateThread(NULL,0, get, (LPVOID)pData, 0, &ThreadId1);
getch();
fclose(infile);
return 0;
}
相关文章推荐
- 二叉树的分层打印(一)
- CodeForces 671A Recycling Bottles
- alert之后留在原页面
- SpringMVC
- 静态代理设计模式
- LeetCode OJ Remove Duplicates from Sorted Array II
- Codeforces Round #324 (Div. 2) A
- 显示Unicode 字节的对应字符的小技巧
- 第18课:Spark Streaming中空RDD处理及流处理程序优雅的停止
- android使用代码生成LayerDrawable的方法、源码分析和注意事项
- Android 中的线程调度
- Linux操作系统基础解析之(七)——Bash(Shell)基础知识(1)
- Android系统权限那些事
- bitmap.setPixels()方法及自己理解
- zzulioj-1877 蛤玮打扫教室
- win10 应用商店无法联网(0x80072EFD)解决方案
- MySQL-MMM实现MySQL高可用读写分离
- 子查询
- Do Evil Things with gopher:// , Ricter · 2016/06/01 9:32
- Parcelable序列化实现方法