[头文件]
#include <semaphore.h>
[创建]
/*
* @brief 信号灯初始化
* @param[in|out] sem 信号灯
* @param[in] pshared 多进程共享,linux下只支持0(只能用于进程内部线程共享)
* @param[in] value 信号灯初始值
* @return 结果
* @li 0 成功
* @li !0 标准错误码
*/
int sem_init(sem_t *sem, int pshared, unsigned int value);
/*
* @brief 点灯
* @param[in|out] sem 信号灯
* @return 结果
* @li 0 成功
* @li !0 标准错误码
*/
int sem_post(sem_t *sem);(v操作,释放资源)
/*
* @brief 灭灯,当灯的个数小于等于0时,挂起线程
* @param[in|out] sem 信号灯
* @return 结果
* @li 0 成功
* @li -1 失败
*/
int sem_wait(sem_t *sem);(p操作,申请资源)
/*
* @brief 灭灯,当灯的个数小于等于0时,返回失败
* @param[in|out] sem 信号灯
* @return 结果
* @li 0 成功
* @li -1 失败
*/
int sem_trywait(sem_t *sem);(p操作)
/*
* @brief 获取灯的个数
* @param[in|out] sem 信号灯
* @param[out] sval 信号灯的个数
* @return 结果
* @li 0 成功
* @li -1 失败
*/
int sem_getvalue(sem_t * sem, int * sval);
[销毁]
/*
* @brief 销毁信号灯
* @param[in|out] sem 信号灯
* @return 结果
* @li 0 成功
* @li -1 失败
* @notes 销毁信号灯时不能有线程正在等待信号灯
*/
int sem_destroy(sem_t * sem);
例子:
#include <stdio.h>
#include <semaphore.h>
sem_t sem;
void *thread(void *arg)
{
sleep(1);
while (1)
{
sem_wait(&sem);
printf("this is thread1!\n");
}
return (void *)0;
}
int main(int argc, char **argv)
{
pthread_t id;
void *ret;
sem_init(&sem, 0, 0);
pthread_create(&id, NULL, thread, NULL);
sleep(1);
while (1)
{
if (sem_trywait(&sem) < 0)
{
printf("sem_post\n");
sem_post(&sem);
sleep(2);
}
}
pthread_join(id, &ret);
return 0;
}