信号量用法

信号量的使用主要有以下接口可供调用:

1 sem_init

#include <semaphore.h>

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

sem_init函数用于初始化一个未命名的信号量;
sem_t *sem:指向一个信号量结构的指针;
int pshared:用于指示信号量是进程内线程共享还是进程间共享;
unsigned int value:用于初始化信号量的值;

返回值:若sem_init成功则初始化
sem_t *sem所指向的信号量结构内容,若失败返回-1,并设置errno的值;

用法:
#include <semaphore.h>
sem_t sem;
memset(&sem, 0, sizeof(struct sem_t));

sem_init(&sem, 0, 1);

2 sem_wait
int sem_wait(sem_t *sem);
sem_wait函数用于锁住
sem_t *sem所指定的信号量,若信号量的值为0,则sem_wait函数不返回,直到获取这个信号量,或被中断返回。若信号量值大于0,则获取信号量返回。
sem_t *sem:指向需要获取的信号量结构指针;
返回值:
若sem_wait返回0表示函数调用成功,并且信号量被锁,若返回-1则表示函数调用失败,并且信号量状态不会发生改变;错误值设置到errno里;



int sem_trywait(sem_t *sem);
功能:若信号量没有被锁,则锁住信号量,若信号量已经被锁则不改变信号量状态,返回-1;
参数:
sem_t *sem:指向需要获取的信号量结构指针;

返回值:
若sem_wait返回0表示函数调用成功,并且信号量被锁,若返回-1则表示函数调用失败,并且信号量状态不会发生改变;错误值设置到errno里;

用法:

#include <semaphore.h>
int iRet = -1;
sem_t sem;
memset(&sem, 0, sizeof(struct sem_t));

sem_init(&sem, 0, 1);

....
// 在一个进程中的线程中共享
iRet = sem_wait(&sem);
// iRet = sem_trywait(&sem);
if (0 == iRet)
{
    printf("lock successful\n");
}
else
{
   printf("lock failed\n");
}
sem_wait和semtrywait函数错误说明:
[EAGAIN] 信号量已经被锁,这个错误只被sem_trywait函数返回

[EINVAL] 信号量指针非法,或指向的信号量已经被释放;

[ENOSYS]
The functions  sem_wait() and  sem_trywait() are not supported by this implementation.

[EDEADLK]

死锁;
A deadlock condition was detected.
[EINTR] 被中断信号中断;

3 sem_post
int sem_post(sem_t *sem);
功能:释放信号量;
参数:
sem_t *sem:指向信号量的指针;
返回值:
0:释放信号量成功;
-1:释放信号量失败,设置errno值
errno:
EINVAL:信号量为空;
用法:
#include <semaphore.h>
int iRet = -1;
sem_t sem;
memset(&sem, 0, sizeof(struct sem_t));

sem_init(&sem, 0, 1);

....
// 在一个进程中的线程中共享
iRet = sem_wait(&sem);
// iRet = sem_trywait(&sem);
if (0 == iRet)
{
    printf("lock successful\n");
}
else
{
   printf("lock failed\n");
}
。。
// do some useful thing
。。
sem_post(&sem);
。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值