Linux 下的信号量

本文详细介绍了Linux下信号量的概念、分类,特别是POSIX信号量的使用,包括无名信号量和有名信号量的创建、操作函数,如sem_init、sem_wait、sem_post等,并给出了无名信号量的例子。
摘要由CSDN通过智能技术生成

linux下的posix有名信号量的几个要点——博客园

最全面的linux信号量解析 ——csdn blog

Semaphore信号量总结——博客园

sem_timedwait ——csdn blog

一、信号量的概念

信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。

信号量是一个结构体,信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。

二、信号量的分类

linux下的信号量有很多种,首先分为 内核信号量 和 用户态信号量。

内核信号量    :由内核控制路径使用。

用户态信号量:用户态信号量又分为 posix信号量 和system V信号量。

(system V比较复杂,头文件为#include <sys/sem.h>;

posix信号量比较简单,#include <semaphore.h>)

然后posix信号量又分为有名信号量和无名信号量。

有名信号量:其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。

无名信号量:其值保存在内存中。Linux 只实现了无名信号量。


三、POSIX信号量

1.无名信号量

无名信号量的创建就像声明一般的变量一样简单,例如:

sem_t   sem_id;

然后再初始化该无名信号量,之后就可以放心使用了。

无名信号量常用于多线程间的同步,同时也用于相关进程间的同步。也就是说,无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量,这两个条件是缺一不可的。


首先介绍一个结构体,sem_t,它在semaphore.h中是这样定义的:

typedef struct sem_t_ * sem_t;

struct sem_t_

{

  int value;

  pthread_mutex_t lock;

  HANDLE sem;

#if defined(NEED_SEM)

  int leftToUnblock;

#endif

};

2、 无名信号相关的函数

1〉 sem_init信号量初始化函数

函数原型:

#include <semaphore.h>

int sem_init(sem_t *sem,int pshared,unisigned int value);

参数意义:

创建一个信号灯sem,初始化其值为value。

pshared决定了信号量可以在几个进程之间共享。pshared==0 用于同一多线程的同步;

若pshared>0 用于多个相关进程间的同步(即

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值