信号量(sem)

一、信号量:(数据操作锁)控制进程间互斥、同步等,协调多个程序同时访问一个共享资源。

工作原理:信号量只能有两种操作等待和操作,即:P V操作,必须是原子操作。

P(sv):如果 sv 的值大于零就减一;如果它的值为零,就挂起;

V(sv):如果有被挂起的,恢复运行,如果没有就加一。

二、函数原型:

int semget(key_t key, int nsems,int semflg);

int semop(int semid,struct sembuf *sops,size_t nsops);

int semctl(int semid, int semnum, int cmd, ...);

/*

*    semid:信号量集的标识符;    semnum:第几个信号量;

*    cmd:需要执行的命令,根据命令的不同,函数有三个或四个参数(union)

*/

cmd:IPC_RMID,立即删除信号集,唤醒被阻塞的进程;

cmd:SETVAL,设置信号量集中的一个单独的信号量的值。

cmd:GETALL用于读取信号量集中的所有信号量的值。

union semun

{

int val;

struct semid_ds *buf;

unsigned short *array;

struct seminfo *_buf;

};//用户需自己定义声明

三、代码实现:

四、实现结果:

时间: 2024-12-20 06:56:29

信号量(sem)的相关文章

信号量sem 的用法

#include <semaphore.h> sem_t sem; sem_init(&sem, 0, 0); sem_post(&sem); sem_wait(&sem); sem_destroy(&sem); 信号量的数据类型为结构sem_t,它本质上是一个长整型的数.函数sem_init()用来初始化一个信号量.它的原型为: extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned in

C++多线程框架-----Mutex互斥和Sem信号量

互斥和信号量是多线程编程的两个基础,其原理就不详细说了,大家去看看操作系统的书或者网上查查吧. 对于互斥的实现,无论什么操作系统都离不开三个步骤 1.初始化互斥锁 2.锁操作 3.解锁操作 对于不同的系统只是实现的函数有一些不同而已,但是功能其实都大同小异,在锁操作和解锁操作的时候大部分系统都有超时机制在里面,来保证不会一直锁在某个地方,我们为了框架简单,没有设置超时,进行锁操作的时候如果得不到锁,将一直等待在那里. Mutex的基类我们描述如下 class CMutex { public: C

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

信号量 --- sem_lock

信号量sem  -----  负责进程间 互斥.同步 等功能 ---- 计量某种资源的个数 1.  本质是一种 数据操作锁(计数器),它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识. 信号量以 信号量集 申请资源. 临界资源:多个进程能够访问的资源 临界区  :访问临界资源的一段代码 互斥 :独占临界资源 同步 :带着顺序性的进程运行,(大部分)建立在互斥的情况下 P操作:检查信号量,不为0 则 信号量-1:反之(为0),挂

linux 进程间信号量管理程序之sem_timedwait使用

在开发过程中,有三个独立运行的程序模块,三个模块都对sqlite数据库进行读写操作.sqlite在linux共享性较差,所以需要加入互斥信号量解决三个模块访问数据库该问题.另外,在加入信号量后,信号量sem初始化为1,如果三个模块任意一个在读或写数据库时ctrl+c掉(调试过程需要),有时会造成信号量sem保持sem_wait后的值,也就是为0:这就造成了死锁. 为了解决上述情况,决定在某一个模块使用sem_timedwait(sem_t *sem,const struct timespec *

todo:读写信号量

读写信号量的相关API有: DECLARE_RWSEM(name) 该宏声明一个读写信号量name并对其进行初始化. void init_rwsem(struct rw_semaphore *sem); 该函数对读写信号量sem进行初始化. void down_read(struct rw_semaphore *sem); 读者调用该函数来得到读写信号量sem.该函数会导致调用者睡眠,因此只能在进程上下文使用. int down_read_trylock(struct rw_semaphore

【Linux-驱动】驱动策略----信号量

访问共享资源的代码区块叫"临界区",临界区需要以某种互斥机制加以保护:自旋锁.信号量等.互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问. 信号量:在Liunx中的信号量是一种睡眠锁.假如进程A先持有信号量F,然后进程B试图获取已经被进程A持有的信号量F时(假如信号量F资源值为1),信号量会将B进程推入等待队列,然后让 其睡眠.当持有信号量的进程A将信号量F释放后,进程B才会被唤醒,从而获得这个信号量,继续执行进程B代码.            PS:信号量的睡眠特

一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)

各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名计算机科学家迪杰斯特拉(Dijkstra)提出的一种概念,专门用来解决进程间同步与相互排斥.在他提出的概念中信号量是一个非负整数值. 信号量的操作仅仅能有两种原子操作: 等待信号; 发送信号. "什么是原子操作呢?"台下有看官在提问.原子操作就是指某个动作在运行时不能被其他动作中断,它会一

linux信号量之进程间同步

概念 linux信号量:允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区. 所在头文件:semaphore.h 主要函数 初始化函数 int sem_init(sem_t *sem, int pshared, unsigned int value) sem:要初始化的信号量 pshared:此信号量是在进程间共享还是线程间共享 value:信号量的初始值 删除函数 int sem_destroy(sem_t *sem) sem:要销

信号量semaphore解析

1 基础概念 信号量在创建时须要设置一个初始值,表示同一时候能够有几个任务能够訪问该信号量保护的共享资源.初始值为1就变成相互排斥锁(Mutex),即同一时候仅仅能有一个任务能够訪问信号量保护的共享资源. 一个任务要想訪问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减1.若当前信号量的值为负数,表明无法获得信号量.该任务必须挂起在该信号量的等待队列等待该信号量可用:若当前信号量的值为非负数.表示能够获得信号量,因而能够立马訪问被该信号量保护的共享资源. 当任务訪问完被信号量保护的