首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
自考
线程能有效地增强不同执行程序之间的通信效率。在大多数的操作系统中,独立进程之间的通信需要与核心交互,以提供进程通信所需的缓冲区。因为父进程的全局变量,在创建子进程后,两者也是分开存放的,所以即使父子进程之间也不能通过全局变量进行通信。可是,由于在同一进程中
线程能有效地增强不同执行程序之间的通信效率。在大多数的操作系统中,独立进程之间的通信需要与核心交互,以提供进程通信所需的缓冲区。因为父进程的全局变量,在创建子进程后,两者也是分开存放的,所以即使父子进程之间也不能通过全局变量进行通信。可是,由于在同一进程中
admin
2016-05-14
22
问题
线程能有效地增强不同执行程序之间的通信效率。在大多数的操作系统中,独立进程之间的通信需要与核心交互,以提供进程通信所需的缓冲区。因为父进程的全局变量,在创建子进程后,两者也是分开存放的,所以即使父子进程之间也不能通过全局变量进行通信。可是,由于在同一进程中的线程共享进程的内存空间,如一个线程修改了存储空间中的一项数据,其他线程访问该数据项时也会获得改变了的结果。因此子线程之间就能通过进程的全局变量进行通信。
编一个C程序,使用进程的全局变量作为输入输出的缓冲区,线程1一次读入一个字符串,将其存入缓冲区,线程2从缓冲区取出数据,输出打印,用线程的互斥锁实现两个线程间韵同步。程序调试成功后用I/O转向再测试程序,标准输入输出都改为文件。
选项
答案
实现该功能的C程序为程序清单15-2。 在程序清单15-2的pthread_comm.c中,主线程创建两个线程,线程1一次读入一个字符串,将其存入缓冲区,线程2从缓冲区取出数据,输出打印。主线程先创建两个子线程,再初始化锁变量,使缓冲区初态为空,通过pthread_join等待子线程终止。当一个线程1将字符串存入缓冲区后,缓冲区状态为已存入,线程2将缓冲区中的字符串取出并打印,缓冲区状态为空,两个线程用互斥锁pthread_rnutex_lock和缓冲区状态标志flag实现互斥和同步,如此循环执行。注意,当一个线程用pthread_mutex_lock上锁,进入临界区后,当发现根据buf的flag标志不能进行存入或取出数据时,就要执行pthread_mutex_unlock操作,以让另一个进程通过pthread_mutex_lock操作进入临界区。当然本进程也可能如此循环地执行pthread_mutex_lock和pthread_mutex_unlock,这就是“自旋锁”。 为了节省处理机时间,可以在这种情况下插入sleep语句,但这与线程的同步无关。 程序清单15-2:pthread_mutex.c #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<string.h> pthread_mutex_t lock=PAHREAD_MUAEX_INIAIALIZER; /*初始化锁后,锁是关闭的*/ struct buf_s{ int flag; char buffer[256]; }buf; main() { pthread_t th_1,th_2;/*两个线程*/ void *put_buf();/*线程1执行的输入和存人缓冲区的函数*/ void *get_buf();/*线程2执行的从缓冲区读出和打印的函数*/ pthread_create(&th_1,NULL,put_buf,NULL);/*创建线程l*/ pthread_create(&th_2,NULL,get_buf,NULL);/*创建线程2*/ buf.flag=0;/*设置初态为缓冲区空*/ pthread_join(th_1,NULL);/*等待子线程1结束*/ pthread_join(th_2,NULL);/*等待子线程2结束*/ } void*put buf()/*线程1并发执行的函数*/ { while(1){ pthread_mutex_lock(&lock)j/*关锁,竞争buf*/ if(buf.flag==0){/*缓冲区空*/ printf("th_1:input string:"); gets(buf.buffer); if(strlen(buf.buffer)!=0)/*读入空串,设置终止运行标志*/ buf.flag=1; else{ buf.flag=2;/*设置终止运行标志*/ } }else Sleep(1); pthread_mutex_unlock(&lock);/*开锁*/ } } void*get_buf()/*线程2并发执行的函数*/ { while(1){ pthread_mutex_lock(&lock);/*关锁,竟争buf*f if(buf.flag==1){/*缓冲区中已存入信息*/ printf("th_2 print:%s.\n",buf.buffer);/*输出缓冲区中信息*/ buf.flag=0;/*缓冲区空标志*/ }else if(buf.flag==2)/*终止运行标志*/ exit(0); else sleep(1); pthread mutex_unlock(&lock);/*开锁*/ } }。
解析
转载请注明原文地址:https://kaotiyun.com/show/ziNx777K
本试题收录于:
操作系统题库理工类分类
0
操作系统
理工类
相关试题推荐
招标投标的基本程序包括招标、投标、开标、________、中标和签订合同六个环节。
在施工进度检查过程中,对不符合要求的部分进行调整,下列方法不正确的是()
保证计算机网络安全的可用性有哪些措施?
为提高电子设备的抗干扰能力,主要的措施有___________、隔离、滤波、吸波和接地等。
关于CIDF的通信机制描述错误的是()
滤波电路是一种__________,它可让一定频率范围内的电信号通过而阻止其他频率的电信号,从而起到滤波作用。()
计算机病毒程序利用操作系统的___________或加载机制进入内存。
如果进程已具备了运行条件,但由于处理机正被其他进程占用,暂时不能运行而等待分配处理机,则称该进程处于()
进程可经历三种基本调度状态,它们是运行状态、就绪状态和________。
简述产生死锁的种类和生成原因。
随机试题
患者,女性,26岁。儿时曾患风湿热,妊娠前常有心悸、气短的症状,现妊娠32周,常于夜间坐起呼吸新鲜空气,休息时心率超过110次/分,步行100米即感呼吸困难。该患者最可能的诊断是
一平面简谐波沿x轴正向传播,已知P点(x0=L)的振动方程为y=ACOS(ωt+φ0),则波动方程为()。
周期为半个太阴日的潮汐叫半日潮。半日潮的特征:两次高潮(或低潮)的潮高相差不大,两次相邻的潮差几乎相等,两次相邻高潮(或低潮)之间的时间间隔()。
下列情况不宜安排路基雨季施工的有()。
(操作员:刘主管;账套:101账套;操作日期:2015年1月31日)1月30日,以银行存款110000元取得一项交易性金融资产,确定该资产的入账价值为110000元。
我国公民张先生为国内某企业高级技术人员,2014年3~12月收入情况如下:(1)每月取得工薪收入8400元。(2)3月转让2011年购买的三居室精装修房屋一套,售价230万元,转让过程中支付的相关税费13.8万元。该套房屋的购进价为100万元,购房过程
一般资料:求助者,男性,28岁,医院主治医师。案例介绍:求助者在大学时与同学谈恋爱,计划毕业后结婚。但毕业后女友出国留学,结婚的事就耽误了下来。四年来女友不断催促他出国,可他放不下自己在国内某著名医院的工作和发展机会,反而力劝女友回国发展,遂与女友
A.L1~2,椎间盘突出B.L2~3椎间盘突出C.L3~4椎间盘突出D.L4~5椎间盘突出E.L5~S1椎间盘突出导致趾及足跖屈力弱的椎间盘突出症是
目前国际上通行的“第八条款国”是指()。
Althoughthefirstyearisreallyimportantforlanguagedevelopmentinchildren,majorlearningcontinuesthroughoutachild’s
最新回复
(
0
)