进程间加锁(信号量)

在网上搜了很多的资料,对于进程间的同步却很少,我这里实现了简单的互斥

对于信号量的创建就不介绍了,可以google

int sem_lock(int key) /* 加锁 */
{
struct sembuf op;
op.sem_num = 0;
  op.sem_flg = SEM_UNDO;
op.sem_op = -1; //increment if abs(sem_op) < sem_val
if (semop(key, &op, 1) == -1)
perror("semop");
}
int sem_unlock(int key) /* 解锁 */
{
struct sembuf op;
op.sem_num = 0;
  op.sem_flg = SEM_UNDO;
op.sem_op = 1;
if (semop(key, &op, 1) == -1)
perror("semop");
}

 

但是这样对于初始化状态不好控制,必须用两个锁,所以我该用了这种加锁,初始化状态为1就可以了。

int sem_lock(int key)

{

struct sembuf op;

op.sem_num = 0;

  op.sem_flg = 0;

op.sem_op = -1; //-1 if abs(sem_op) >= sem_val

if (semop(key, &op, 1) == -1)

perror("semop");

}

 

int sem_unlock(int key)

{

struct sembuf op;

op.sem_num = 0;

  op.sem_flg = 0;

op.sem_op = 1;

if (semop(key, &op, 1) == -1)

perror("semop");

}

 

2020/2/14备注:

上面使用的是System V版本比较复杂,POSIX 版本比较简单sem_wait sem_post即可。具体差异可以参考

http://blog.sina.com.cn/s/blog_590be5290102w7cu.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值