线程同步3 ------ 信号量在不同进程间同步的又一个实例

来源:互联网 发布:淘宝客户信息 编辑:程序博客网 时间:2024/06/03 19:04

      以下实例通过信号量实现对临界资源的同步访问问题。server程序创建一个信号集,并对信号量循环减1,相当于分配资源。而client在执行时首先检查信号量,如果大于0代表有资源可用,就继续执行。如果信号量小于0代表资源已经分配完毕,进程client退出。

server.c

//server.c#include <sys/types.h>#include <linux/sem.h>#define MAX_RESOURCE5int main(void){key_tkey;intsemid;struct sembufsbuf = {0, -1, IPC_NOWAIT};union semunsemopts;if ((key = ftok(".", 's')) == -1){perror ("ftok error!\n");exit (1);}if ((semid = semget (key,1,IPC_CREAT|0666)) == -1){perror ("semget error!\n");exit (1);}semopts.val = MAX_RESOURCE;if (semctl (semid,0,SETVAL, semopts) == -1){perror ("semctl error!\n");exit (1);}while (1){if(semop(semid, &sbuf, 1) == -1){perror ("semop error!\n");exit (1);}sleep (3);}exit (0);}

//client.c#include <sys/types.h>#include <linux/sem.h>int main(void){key_tkey;intsemid, semval;union semunsemopts;if((key = ftok (".",'s')) == -1){perror ("ftok error!\n");exit (1);}if((semid = semget (key, 1, IPC_CREAT | 0666)) == -1){perror ("semget error!\n");exit (1);}while(1){if ((semval = semctl(semid, 0, GETVAL, 0)) == -1){perror ("semctl error!\n");exit (1);}if (semval > 0){printf ("Still %d resources can be used\n", semval);}else{printf ("No more resources can be used!\n");break;}sleep (3);}exit (0);}

      打开两个shell终端,分别执行server和client两个程序。以下是2个程序的执行结果。

server执行情况:



client执行情况:


原创粉丝点击