信号量用法

来源:互联网 发布:百叶帘品牌 知乎 编辑:程序博客网 时间:2024/06/16 17:44

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

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);
。。。


原创粉丝点击