线程同步3 ------ 信号量在不同进程间同步的又一个实例
2017-12-15 11:23
337 查看
以下实例通过信号量实现对临界资源的同步访问问题。server程序创建一个信号集,并对信号量循环减1,相当于分配资源。而client在执行时首先检查信号量,如果大于0代表有资源可用,就继续执行。如果信号量小于0代表资源已经分配完毕,进程client退出。
server.c
打开两个shell终端,分别执行server和client两个程序。以下是2个程序的执行结果。
server执行情况:
![](http://img.blog.csdn.net/20171215112223889)
client执行情况:
server.c
//server.c #include <sys/types.h> #include <linux/sem.h> #define MAX_RESOURCE 5 int main(void) { key_t key; int semid; struct sembuf sbuf = {0, -1, IPC_NOWAIT}; union semun semopts; 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_t key; int semid, semval; union semun semopts; 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执行情况:
相关文章推荐
- 2.2.9同一个类的不同静态方法不同实例不同线程是同步的
- 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与互斥一)
- 根据现实中一个实例--线程和进程的理解
- ReaderWriterLock(定义支持单个写线程和多个读线程的锁),Mutex(一个同步基元,也可用于进程间同步。 )
- 进程与线程;同步与互斥:事件,信号量,临界区,互斥量
- 计算机必知必会:进程process与线程thread 进程定义为一个正在运行的程序的实例
- 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)
- 一起talk C栗子吧(第一百零二回:C语言实例--使用信号量进行进程间同步与互斥三)
- 关于java多线程中同步的问题(两个线程访问同一个实例类的两个同步方法,会不会互相影响)
- linux 不同进程间和线程间的同步
- ReaderWriterLock(定义支持单个写线程和多个读线程的锁),Mutex(一个同步基元,也可用于进程间同步。 )
- 【进程线程与同步】5.2 避免在同一机器上运行同一程序的多个实例
- 【进程线程与同步】5.2 避免在同一机器上运行同一程序的多个实例
- QT单实例应用,使用QLocalSocket进行进程通信,不同运行权限下运行的同一个进程通讯失败,报错 “QLocalSocket::SocketAccessError”
- Linux 线程信号量,进程信号量和内核驱动程序信号量(线程同步信号量,进程同步信号量和设备驱动同步信号量)
- Java实例说明 100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况
- 线程(进程)的同步与互斥实例
- 进程、线程、信号量、互斥锁的一个简单解释
- 同一个进程中生成的不同线程的栈是互相可见的
- Unix高级编程:线程的同步之信号量、进程通信之信号量集、system函数、简单web服务器代码