線程的信號燈

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章