进程同步与互斥内容摘要:

l(semid,IPC_RMID,0)。 因为信号量不是普通变量,对它赋初值只能通过系统调用函数semctl(semid,0,SETVAL,arg)进行,其值的修改只能通过 P、 V操作,而不能使用普通的赋值语句。 因此其初值和信号量的 P、 V操作需要事先定义好以后,然后才能在进程中执行 P、 V操作。 2020/11/23 15 应用举例 [例 49] 设有父子 2个进程共享一个临界资源 , 每个进程循环进入该临界区 3次:父进程每次进入临界区后显示 “ prnt in”, 出临界区则显示“ prnt out”;子进程每次进入临界区后显示 “ chld in”出临界区则显示 “ chld out”。 观察运行结果 , 应该是一个进程出来后另一个才能进去。 分析: 对临界区设置互斥信号量 mutex, 其内部标识为 mutexid, 初值为 1。 程序中使用睡眠延时 1秒来模拟进入临界区前和进入后所执行的程序。 2020/11/23 16 程序清单:文件名 include include include includesys/ includelinux/ int mutexid。 //定义信号量标识 int main() { int chld,i,j。 /*定义数据结构 */ struct sembuf P,V。 union semun arg。 /*创建只含有一个互斥信号量元素的信号量集 */ mutexid=semget(IPC_PRIVATE,1,0666|IPC_CREAT)。 /*为信号量赋初值 */ =1。 if(semctl(mutexid,0,SETVAL,arg)==1) perror(semctl setval error)。 2020/11/23 17 /*定义 P、 V操作 */ =0。 =1。 =SEM_UNDO。 =0。 =1。 =SEM_UNDO。 while((chld=fork())==1)。 //创建子进程 if(chld0) //父进程返回 { i=1。 while(i=3) //循环 3次 { sleep(1)。 semop(mutexid,amp。 P,1)。 //进入临界区前执行 P操作 printf(prnt in\n)。 sleep(1)。 printf(prnt out\n)。 semop(mutexid,amp。 V,1)。 //出临界区执行 V操作 i++。 } wait(0)。 //等待子进程终止 semctl(mutexid,IPC_RMID,0)。 //撤消信号量 exit(0)。 } 2020/11/23 18 else //子进程返回 { j=1。 while(j=3) //循环 3次 { sleep(1)。 semop(mutexid,amp。 P,1)。 //进入临界区前执行 P操作 printf(chld in\n)。 sleep(1)。 printf(chld out\n)。 semop(mutexid,amp。 V,1)。 //出临界区执行 V操作 j++。 } exit(0)。 //子进程终止 } } 2020/11/23 19 编译连接及运行结果: 2020/11/23 20 利用信号量实现进程同步 [例 410] 父进程创建一个子进程 , 父子进程共享一个存储区 , 子进程向共享存储区中以覆盖方式写信息 , 父进程从该共享存储区中读信息并显示信息。 父子进程轮流读写 , 即子进程写一个信息到共享内存中 , 父进程从中读该信息输出;然后子进程再写第 2个信息 , 父进程再读出第 2个信息输出 , 如图 46所示。 当信息为 “ end”时读写进程结束。 父进程 子进程 单缓冲区 图。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。