好文档 - 专业文书写作范文服务资料分享网站

操作系统实验报告线程并发拷贝程序

天下 分享 时间: 加入收藏 我要投稿 点赞

for(wstart=0;wstart

{

*(pipecb3575[pf].p_addr+offw%PSIZE) = *ca; ca++; offw++;

}

file[w].f_offset = offw;/*重定位写指针位置*/ n1 = n1-m;/*剩余需要读的字符个数*/

printf(\ pthread_cond_signal(&rflag);/*唤醒读线程,管道可读*/ printf(\waiting\\n\

pthread_cond_wait(&wflag,&lock);/*写线程封锁等待*/ } }

/*一次性可将ca中内容全部写入管道*/ offr = file[r].f_offset; offw = file[w].f_offset;

for(wstart=0;wstart

/*printf(\ *(pipecb3575[pf].p_addr+offw%PSIZE) = *ca;

/*printf(\ ca++; offw++; }

file[w].f_offset = offw; pthread_cond_signal(&rflag); printf(\ pthread_mutex_unlock(&lock);

printf(\pipe\\n\

return n;/*返回写入字符个数*/ }

/*读管道*/

int numread_simulate3575;_inode;/*读管道对应的pipecb3575表的下标*/ int rstart = 0;/*计数器,读出字符个数*/ int i = 0;

for(i;i

if((file[i].f_flag=='w')&&(file[i].f_inode==pf)) {

w = i; break;

} else {

continue; } }

printf(\

pthread_mutex_lock(&lock);/*互斥锁,相当于进入临界区*/ offr = file[r].f_offset;/*赋值读指针*/ offw = file[w].f_offset;/*赋值写指针*/ if(offr==offw)/*管道空,无内容可读*/ {

printf(\ if(pipecb3575[pf].p_count==1)/*写端关闭*/ {

pipecb3575[pf].p_count--;/*文件的复制以完成,释放管道文件的空间*/

printf(\finished\\n\

return 0; } else

{

printf(\writable\\n\

pthread_cond_signal(&wflag);/*唤醒写线程,管道可写*/ printf(\waiting\\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 = *(pipecb3575[pf].p_addr+offr%PSIZE); ca++; offr++; }

file[r].f_offset = offr;/*重定位读指针位置*/

printf(\ pthread_cond_signal(&wflag); printf(\

pthread_mutex_unlock(&lock);

printf(\memory *ca\\n\ return m; }

/*线程调用,读源文件,写管道*/

void *pwrite3575(void *a)_inode].p_count--;/*文件已读完,关闭管道写端*/ } else {

perror(args->fname);/*打开源文件可能不成功*/ return NULL; }

printf(\into pipe\\n\ return NULL; }

/*线程调用,写目标文件,读管道*/

void *pread3575(void *a)name=argv[1];/*源文件名*/ args[0].f=fd[1];/*管道文件写端*/ args[1].fname=argv[2];/*目标文件名*/

9v1ea4jg8n79c964hjsm5kaxd91bwp00kvw
领取福利

微信扫码领取福利

微信扫码分享