线程同步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执行情况:
阅读全文
0 0
- 线程同步3 ------ 信号量在不同进程间同步的又一个实例
- 线程同步3 ------ 信号量实现进程或者线程之间的同步
- 线程的同步--信号量
- 进程间同步 信号量
- linux 不同进程间和线程间的同步
- linux进程间的通信--信号量同步
- 基于信号量的线程同步
- 基于信号量的线程同步
- 线程的同步(四)---信号量
- 线程同步信号量的使用
- Linux线程的信号量同步
- Linux线程的信号量同步
- 进程间同步之--信号量
- 线程间同步 之 信号量
- 线程同步3 ------ Linux进程间通信——使用信号量
- 线程同步 、同步锁、信号量
- 线程同步之信号量同步
- 线程同步之信号量同步
- Mysql命令大全(完整版)
- java设计模式--观察者模式
- Linux – 文字介面 tty(S) 的自動登入
- C# params object[] args 可以传多个参数,可以不限制类型
- 基于主机的卡仿真(Host-based Card Emulation)
- 线程同步3 ------ 信号量在不同进程间同步的又一个实例
- TensorFlow识别图片数字
- Spring Bean 的5种作用域介绍
- Redundant_Connection_II
- git基本常识介绍
- 基于单例模式的配置文件读取方法
- 八种基本数据类型
- AndroidStudio项目配置一个重要概念:源集
- jQuery 操作 radio、select、checkbox