竟态-semaphore

在日常开发中,竟态是难以避免的。

当多个进程同时访问同一个资源或者数据结构时,竟态便会发生。

semaphore便是解决这种现象的一个手段。

 

semaphore进程同步互斥的量,能保证资源在被一个进程使用时,其他进程无法使用此资源。

Linux中使用struct semaphore来定义这个互斥的信号量。

 

以下是使用过程中会用到的一些方法。

 

初始化:

void sema_init(struct semaphore *sem, int val);

val是赋予一个信号量的初始值。这个值表示可用的资源数量。用停车场作比喻,当把val设为1,那么就表示这个停车场只有一个车位(只能同时提供1个进程使用),当把val设为10,就表示这个停车场有10个车位(可以同时提供给10个进程使用)。

当资源被用尽之后,那个后续调用者会被至于休眠,当有可用资源时,调用者会被唤醒。

 

当然,在很多时候semaphore资源数量都是1,所以系统也提供了以下两个初始化的宏。

DECLARE_MUTEX(name);//名称为name的信号量,被初始化为1

DECALRE_MUTEX_LOCKED(name);//名称为name的信号量,被初始化为0

在新版本中他们被改为DEFINE_SEMAPHORE(name);

因为有开发者认为DECLARE_MUTEX会对人产生误导。

 

获取访问权:

想要获取被semaphore保护的内容的访问权,就需要用到down方法。

void down(struct semaphore *sem);

int down_interruptible(struct semaphore *sem);

int down_trylock(struct semaphore *sem);

down_interruptible表示操作是可中断的。一般来说都是使用可中断的版本。使用可中断版本时,要额外小心返回值,如果操作被中断,改函数会返回非零值,而调用者不会拥有该信号量。down_trylock永远不会休眠,如果信号量在调用时不可获得,会立刻返回一个非零值,可在中断上下文使用。

 

释放访问权:

在互斥操作完成后,使用up函数释放访问权。

void up(struct semaphore *sem);

任何拿到信号量的线程都必须通过一次(只有一次)对up的调用而释放该信号量。在出现错误的情况下,经常需要特别小心;如果在拥有一个信号量时发生错误,必须在将错误状态返回给调用者之前释放该信号量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值