您好,欢迎来到刀刀网。
搜索
您的当前位置:首页Linux操作系统-Pthread代码解析-读者写者

Linux操作系统-Pthread代码解析-读者写者

来源:刀刀网


新乡学院计算机与信息工程学院

实 验 报 告

课程名称 操作系统原理 专 业 计算机科学与技术 班 级 3班 学 号 2013052701xx 姓 名 xxx

实验成绩 任课教师 xxx

2013年 12月 3日

实验名称 姓 名 实验地点 一、 实验目的与要求 xxx Pthread代码解析---读者写者 成 绩 实验时间 2013年 12月 10日 A14-322 实验目的:进一步熟悉linux中Pthread代码解析---读者写者 实验要求:认真 二、 操作步骤 1.编写reader-writer.c文件代码,代码如下: #include #include #include #include sem_t w_sem, r_sem; int read_count = 0; void *reader(void *arg) { //int read_count = 0; //会造成死锁 while (1) { //定义信号量共享指针 sem_wait(&r_sem); //允许一个读者读书,用来阻塞当前线程直到信号量r_sem的值大于0,解除阻塞后将r_sem的值减一,表明公共资源经使用后减少 if (read_count == 0) { //判断是否有读者读书 sem_wait(&w_sem); //有读者进入,不允许写文件,用来阻塞当前线程直到信号量w_sem的值大于0,解除阻塞后将w_sem的值减一,表明公共资源经使用后减少 } read_count++; //读者人数+1 //打印输出第read_count读者数量 printf(\"the number of reader is:%d\\n\ sem_post(&r_sem); //允许读者读文件,增加信号量r_sem的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞 printf(\"the reader is reading!\\n\"); sleep(1); //打印输出读者在读书 sem_wait(&r_sem); //允许一个读者读书,用来阻塞当前线程直到信号量r_sem的值大于0,解除阻塞后将r_sem的值减一,表明公共资源经使用后减少 read_count--; //读者数量-1 if (read_count == 0) { sem_post(&w_sem); //有读者进入,不允许写文件,用来阻塞当前线程直到信号量w_sem的值大于0,解除阻塞后将w_sem的值减一,表明公共资源经使用后减少 } sem_post(&r_sem); //允许一个读者读书,用来阻塞当前线程直到信号量r_sem的值大于0,解除阻塞后将r_sem的值减一,表明公共资源经使用后减少 } void *writer(void *arg) { while (1) { } return (void *)0; //返回任意类型的指针 sem_wait(&w_sem); //不允许多个写者同时写文件,一个原子操作,它的作用是从信号量w_sem的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法,阻塞当前线程直到信号量w_sem的值大于0,解除阻塞后将w_sem的值减一,表明公共资源经使用后减少 printf(\"the writer is writing!\\n\"); //输出写者正在写 sleep(1); //睡一会 sem_post(&w_sem); //允许写者写文件,增加信号量w_sem的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞 } int main() { pthread_t pid_reader, pid_reader2, pid_writer; //创建读者写者线程函数线程号 } return (void *)0; sleep(3); //睡一会 sem_init(&w_sem, 0, 1); 量进程内线程共享 sem_init(&r_sem, 0, 1); 量进程内线程共享 //初始化一个定位在 w_sem 的匿名信号量,初始值为1,0表示此信号//初始化一个定位在 r_sem 的匿名信号量,初始值为1,0表示此信号 pthread_create(&pid_writer, NULL, writer, NULL); //创建并跳转到线程函数创建并跳转到参数为指向线程标识符的指针为 pid_writer 线程函数writer pthread_create(&pid_reader, NULL, reader, NULL); //创建并跳转到线程函数创建并跳转到参数为指向线程标识符的指针为 pid_reader 线程函数reader pthread_create(&pid_reader2, NULL, reader, NULL); //创建并跳转到线程函数创建并跳转到参数为指向线程标识符的指针为 pid_reader2 线程函数reader pthread_join(pid_reader, NULL); //等待线程号为pid_reader线程函数结束 pthread_join(pid_reader2, NULL); //等待线程号为pid_reader2线程函数结束 pthread_join(pid_writer, NULL); sem_destroy(&w_sem); //等待线程号为pid_writer线程函数结束 //释放信号量w_sem sem_destroy(&r_sem); //释放信号量r_sem return 0; } 三、 实验结果 1:在终端输入gcc reader-writer.c -o reader -lpthread命令之后,运行reader结果如下: [root@bogon 第八个]# gcc reader-writer.c -o reader -lpthread [root@bogon 第八个]# ./reader the writer is writing! the number of reader is:1 the reader is reading! the number of reader is:2 the reader is reading! the number of reader is:1 the reader is reading! the number of reader is:2 the reader is reading! the number of reader is:1 the reader is reading! the number of reader is:2 the reader is reading! the number of reader is:1 the reader is reading! the number of reader is:2 the reader is reading! the number of reader is:1 the reader is reading! the number of reader is:2 the reader is reading! 评语: 指导老师(签名):

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务