[頭文件]
#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;
}