SQL线程拷贝并发程序.docx
- 文档编号:18274363
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:22
- 大小:268.92KB
SQL线程拷贝并发程序.docx
《SQL线程拷贝并发程序.docx》由会员分享,可在线阅读,更多相关《SQL线程拷贝并发程序.docx(22页珍藏版)》请在冰点文库上搜索。
SQL线程拷贝并发程序
二、代码:
#include
#include
#include
#include
#include
#include
#include
#definePSIZE4096/*管道文件的大小*/
#defineBSIZE512/*默认缓冲区的大小*/
#defineNOFILE20/*u_ofile3083表可分配的个数*/
#defineNFILE20/*file表可分配的个数*/
#defineNPIPE20/*pipecb3083可分配的个数*/
/*进程的u_file表*/
intu_ofile3083[NOFILE];
/*模拟file表*/
struct
{
charf_flag;/*读写标志,'w'表示写,'r'表示读*/
intf_count;/*表示此表项的状态,=0表示此表项没被使用,可分配;=1表示此表项在被使用,不可再分配*/
intf_inode;/*对应的pipecb3083表下标*/
longf_offset;/*读写指针,当前已读或已写个数*/
}file[NFILE];
/*管道控制块*/
struct
{
char*p_addr;/*管道文件基地址*/
intp_size;/*管道文件大小,PSIZE*/
intp_count;/*=2表示读写都在被进行,=1表示在被读或被写,=0表示管道没被使用,可分配*/
}pipecb3083[NPIPE];
/*模拟管道文件*/
char*pfile;
/*管道的写入写出端*/
intfd[2];
/*锁机制,实现互斥*/
pthread_mutex_tlock=PTHREAD_MUTEX_INITIALIZER;
/*进程间通信,实现同步*/
pthread_cond_trflag=PTHREAD_COND_INITIALIZER;/*读信号量*/
pthread_cond_twflag=PTHREAD_COND_INITIALIZER;/*写信号量*/
/*线程创建函数只能传一个参数,用结构体来封装所有参数*/
structarg_set
{
char*fname;/*文件名*/
intf;/*传递fdp[]*/
};
unsignedlongGetTickCount()
{
structtimespects;
clock_gettime(CLOCK_MONOTONIC,&ts);
return(ts.tv_nsec/1000);
}
unsignedlongWrite_time;
unsignedlongRead_time;
/*u_ofile3083表初始化*/
intu_ofile_init3083()
{
printf("inittheu_ofile3083\n");
inti;
for(i=0;i u_ofile3083[i]=-1; u_ofile3083[0]=0; u_ofile3083[1]=0; u_ofile3083[2]=0; return0; } /*创建管道*/ intpipe_simulate3083(inta[]) { unsignedlongtime=GetTickCount(); printf("Creatpipestartsat%dus\n",time); printf("startcreatpipe\n"); inti; for(i=0;i { if(u_ofile3083[i]==-1) { a[0]=i;/*读*/ u_ofile3083[i]=0;/*读端*/ break; } } for(i;i { if(u_ofile3083[i]==-1) { a[1]=i;/*写*/ u_ofile3083[i]=1;/*写端*/ break; } } if(i>=NOFILE) { printf("u_ofile3083isfalse,creatpipeisfilure\n"); return-2; } pfile=(char*)malloc(PSIZE*sizeof(char));/*申请模拟管道用的内存空间*/ if(pfile==NULL)/*申请可能不成功*/ { printf("mallocisfalse,failuretocreateapipe\n"); return-1; } for(i=0;i { if(file[i].f_count! =1) { file[i].f_flag='r';/*读标志*/ //file[i].f_inode=0;/*读对应pipecb3083表下标*/ file[i].f_count=1;/*file[0]这个表项在被使用,不可再分配*/ file[i].f_offset=0;/*读指针*/ u_ofile3083[a[0]]=i;/*读端*/ break; } } for(i=0;i { if(file[i].f_count! =1) { file[i].f_flag='w';/*写标志*/ //file[i].f_inode=0;/*写对应pipecb3083控制块下标*/ file[i].f_count=1;/*file[1]这个表项在被使用,不可再分配*/ file[i].f_offset=0;/*写指针*/ u_ofile3083[a[1]]=i;/*写端*/ break; } } if(i>=NFILE) { printf("fileisfalse,creatpipefilure\n\n"); return-1; } for(i=0;i { if(pipecb3083[i].p_count==0) { pipecb3083[i].p_addr=pfile;/*给管道文件基地址赋值*/ pipecb3083[i].p_size=PSIZE;/*管道文件大小*/ pipecb3083[i].p_count=2;/*读写都在进行,此pipecb3083表项不可再分*/ file[u_ofile3083[a[0]]].f_inode=i; file[u_ofile3083[a[1]]].f_inode=i; break; } } if(i>=NPIPE) { printf("pipeisfalse,creatpipefilure\n"); return-1; } printf("endcreatpipe,succe\n"); printf("Creatpipeendsat%dus\n",GetTickCount()); time=GetTickCount()-time; printf("Creatpipecost%dus\n",time); return0;/*分配成功*/ } /*关闭管道*/ intclose_simulate3083(inta[]) { printf("closepipeisstart.\n"); char*p; inti; for(i=0;i<2;i++) { p=pipecb3083[file[u_ofile3083[a[i]]].f_inode].p_addr; /* if(p! =NULL) free(p);//释放管道内存 */ pipecb3083[file[u_ofile3083[a[i]]].f_inode].p_count=0;/*管道控制块计数清零*/ file[u_ofile3083[a[i]]].f_count=0;/*file表项计数清零*/ u_ofile3083[a[i]]=-1;/*u_ofile3575表项清空*/ a[i]=-1;/*fdp[]清空? */ } printf("closepipeisend.\n"); return0; } /*写管道*/ staticintnumwrite_simulate3083; intwritep3083(intfd,char*ca,intn)//将内存ca内容写入n个字符到管道fd里 { printf("writep(memory---->pipe)putdatafrommemorytopipe\n"); numwrite_simulate3083++; longoffr,offw;/*读写指针,实际是读写字符个数*/ intr;/*管道文件读端*/ intm;/*若ca中的字符不能一次写完,m用来表示一次可写入的字符的最大数*/ intw=u_ofile3083[fd];/*管道文件写端*/ intpf=file[w].f_inode;/*读管道对应的pipecb3083表的下标*/ intn1=n;/*一次应该写入的字符个数*/ intwstart=0;/*计数器,写入字符个数*/ inti=0; for(i;i { if((file[i].f_flag=='r')&&(file[i].f_inode==pf)) { r=i; break; } else { continue; } } printf("----lock\n"); pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/ offr=file[r].f_offset;/*赋值读指针*/ offw=file[w].f_offset;/*赋值写指针*/ if((offw+n1-PSIZE)>offr)/*不能一次写完*/ { if(pipecb3083[pf].p_count==0)/*对文件的复制操作已进行结束,管道文件被释放*/ { printf("copyfileisover,pipefilereleas\n"); return0; } else { m=PSIZE+offr-offw;/*最多可写入数*/ for(wstart=0;wstart { *(pipecb3083[pf].p_addr+offw%PSIZE)=*ca; ca++; offw++; } file[w].f_offset=offw;/*重定位写指针位置*/ n1=n1-m;/*剩余需要读的字符个数*/ printf("awakereaders,pipe_readisok.\n"); pthread_cond_signal(&rflag);/*唤醒读线程,管道可读*/ printf("Writethreadsblockedwaited\n"); pthread_cond_wait(&wflag,&lock);/*写线程封锁等待*/ } } /*一次性可将ca中内容全部写入管道*/ offr=file[r].f_offset; offw=file[w].f_offset; for(wstart=0;wstart { /*printf("%d\n",pipecb3083[pf].p_addr);*/ *(pipecb3083[pf].p_addr+offw%PSIZE)=*ca; /*printf("%d\n",wstart);*/ ca++; offw++; } file[w].f_offset=offw; pthread_cond_signal(&rflag); printf("----unlock\n"); pthread_mutex_unlock(&lock); printf("writep(memory---->pipe)successputthedatafrommemorytopipe\n"); printf("%d-------Write_pipeendsat%dus\n",numwrite_simulate3083,GetTickCount()); Write_time=GetTickCount()-Write_time; printf("%d-------Write_pipecost%dus\n",numwrite_simulate3083,Write_time); //printf("Secceed(memory---->pipe)input\n"); returnn;/*返回写入字符个数*/ } /*读管道*/ intnumread_simulate3083;//read_simulate3083diaoyongshu intreadp3083(intfd,char*ca,intn)//将管道fd内容读取n个字符到内存ca里 { printf("read(pipe---->memory)putthedatafrompipetomemory\n"); numread_simulate3083++; longoffr,offw;/*读写指针,实际是读写字符个数*/ intw;/*管道文件写端*/ intm;/*若ca中的字符不能一次读完,m用来表示一次可读出的字符的最大数*/ intr=u_ofile3083[fd];/*管道文件读端*/ intpf=file[r].f_inode;/*读管道对应的pipecb3083表的下标*/ intrstart=0;/*计数器,读出字符个数*/ inti=0; for(i;i { if((file[i].f_flag=='w')&&(file[i].f_inode==pf)) { w=i; break; } else { continue; } } printf("----lock\n"); pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/ offr=file[r].f_offset;/*赋值读指针*/ offw=file[w].f_offset;/*赋值写指针*/ if(offr==offw)/*管道空,无内容可读*/ { printf("pipeisnull,nothingcanberead\n"); if(pipecb3083[pf].p_count==1)/*写端关闭*/ { pipecb3083[pf].p_count--;/*文件的复制以完成,释放管道文件的空间*/ printf("copyfileissuccess\n"); return0; } else { printf("awakewriters,pipe_writeisok.\n"); pthread_cond_signal(&wflag);/*唤醒写线程,管道可写*/ printf("Readthreadsblockedwaited\n"); pthread_cond_wait(&rflag,&lock);/*读线程封锁等待*/ } } offr=file[r].f_offset; offw=file[w].f_offset; m=n<=(offw-offr)? n: (offw-offr);/*得到可读字符个数*/ for(rstart=0;rstart { *ca=*(pipecb3083[pf].p_addr+offr%PSIZE); ca++; offr++; } file[r].f_offset=offr;/*重定位读指针位置*/ printf("awakewriters,Readthreadsblockedwaited\n"); pthread_cond_signal(&wflag); printf("unlock\n"); pthread_mutex_unlock(&lock); printf("readp(pipe---->memory)successputthedatafrompipetomemory\n"); printf("%d-------Read_pipeendsat%dus\n",numread_simulate3083,GetTickCount()); Read_time=GetTickCount()-Read_time; printf("%d-------Read_pipecost%dus\n",numread_simulate3083,Read_time); returnm; } /*线程调用,读源文件,写管道*/ void*write_simulate3083(void*a)//将源文件a内容写入管道中 { printf("write_simulatestart(file---->pipe)putthedatafromfiletopipe\n"); charabuf1[BSIZE]; structarg_set*args=(structarg_set*)a;/*需要传入多个参数时,用结构体传*/ intfdr; intn_r;/*管道文件写入字符数*/ if((fdr=open(args->fname,O_RDONLY))! =-1) { Write_time=GetTickCount(); printf("0-------Write_pipestartsat%d\n",Write_time); printf("(file---->memory)putthedatafromfiletomemory\n"); while((n_r=read(fdr,abuf1,BSIZE))>0)/*读文件,写管道*/ { printf("(file---->memory)successputthedatafromfiletomemory\n"); //printf("(memory---->pipe)inputdatainmemory*caintopipe\n"); writep3083(args->f,abuf1,n_r); Write_time=GetTickCount(); printf("%d-------Write_pipestartsat%d\n",numwrite_simulate3083+1,Write_time);//下一次写管道执行开始时间 } pipecb3083[file[u_ofile3083[args->f]].f_inode].p_count--;/*文件已读完,关闭管道写端*/ } else { perror(args->fname);/*打开源文件可能不成功*/ returnNULL; } printf("end(file---->pipe)putthedatafromfiletopipe\n"); returnNULL; } /*线程调用,写目标文件,读管道*/ void*read_simulate3083(void*a)//读取管道,将其中内容写入新建文件中 { printf("read_simulate3083(pipe---->file)putthedatafrompipetofile\n"); charabuf2[BSIZE];/*缓冲区*/ structarg_set*args=(structarg_set*)a;/*需要传入多个参数时,用结构体传*/ intfdw; intn_w;/*管道文件读出字符数*/ if((fdw=open(args->fname,O_CREAT|O_RDWR,0777))! =-1) { Read_time=GetTickCount(); printf("0-------Read_pipestartsat%d\n",Read_time); while((n_w=readp3083(args->f,abuf2,BSIZE))>0)/*读管道,写文件*/ { printf("(memory---->file)putdatafrommemorytofile\n"); write(fdw,abuf2,n_w); printf("(memory---->file)successputdatafrommemorytofile\n"); Read_time=GetTickCount(); printf("%d-------Read_pipestartsat%d\n",numread_simulate3083+1,Read_time);//下一次读管道执行开始时间 } } else { perror(args->fname);/*打开目标文件可能出错*/ returnNULL; } printf("(pipe---->file)putthedatafrompipetofile\n"); returnNULL;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 线程 拷贝 并发 程序