线程的信号灯

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

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