1 / 10
文档名称:

C语言线程问题,异步.txt

格式:txt   页数:10页
下载后只包含 1 个 TXT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C语言线程问题,异步.txt

上传人:wzt520728 2015/5/10 文件大小:0 KB

下载得到文件列表

C语言线程问题,异步.txt

相关文档

文档介绍

文档介绍:共享IO/异步IO (2010-11-15 18:27)
分类: C和C++和Core
打开一个文件描述符(句柄),一个进程(线程)来写,一个进程(线程)来读。这是可以做到的,不用多次打开这个文件,但是写端必须刷新缓冲,并且读端必须把文件指针进行重置。
共享IO常用的允许同一个文件被不同模块读和写。这没有问题。如果要在一个程序里面,非阻塞的相应多个Io操作,就必须用到异步Io和多工机制。
Window上使用重叠Io+异步过程回调Apc,使用事件通知。
Unix上常使用select,poll来做多Io事件触发查询。
Unix上的Aio类似于Windows的完成端口IOCP,他们都有线程池。但是Aio是注册回调的;完成端口的编程类似于select,主动查询事件的,只是事件通知由后台的线程池完成了,不需要再注册回调,所以IOCP对于异步完成的包装更加彻底。如果把Aio的线程池去掉,那么就是Windows的Apc。
Linux的epoll也是内核回调不需要用户注册(pletionStatus),但是epoll没有线程池。
所以IOCP综合了Aio和epoll的优点于一身,不需要显示的使用Apc和ThreadPoll,编程更加简洁。
源代码1: unix下用多进程实现:
#include<>
#include<sys/>
#include<sys/>
#include<sys/>
#include<>
#include<>
#include<>
#include<>
int main(void){
int fd=open("",O_RDWR|O_CREAT,S_IRWXU);
if(0==fd){
printf("open failed\n");
return 1;
}
pid_t p=fork();
char buf[20];
if(p){//father
wait(0);
lseek(fd,0,SEEK_SET);
if(6!=read(fd,buf,sizeof(buf))){
printf("read error %d:%s\n",errno,strerror(errno));
return 1;
}
printf("content read:%s\n",buf);
close(fd);
}else if(0==p){
write(fd,"hello",6);
sync();
}
return 0;
}
程序输出:
> ./
content read:hello
源代码2: windows下用多线程实现:
#include ""
#include<>
#include<>
HANDLE hFile;
void* fun(void*){
char hw[]="helloworld";
DWORD dwWriten;
if(!WriteFile(hFile,(LPVOID)hw,sizeof(hw),&dwWriten,NULL)){
printf("WriteFile f