信号量sem_wait()的使用
2013-12-16 19:56
671 查看
闲来无事,我给大家讲下UNIX/Linux下信号量函数的使用。
首先你得知道什么叫信号量,什么时候要用信号量。
这个嘛,主要就是用来保护共享资源的,也就是说如果你想限制某个(些)资源在同一时刻只能有一(多)个线程拥有,就可以使用信号量。当然也可以用作让一个线程等待另一个线程完成某项工作。
用下面一组函数(系统调用)来实现。
int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem);
具体要Include什么头文件,在你的系统上man sem_init吧。
这组函数是POSIX标准的无名信号量函数,另外还有具名信号亮,这个嘛,等下回再说。
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。
OK?
另外几个函数sem_trywait ,顾名思义,望文生义,就是测试一下看看现在有没有可用的信号灯,而不会阻塞。
sem_getvalue嘛就是读取当前的信号灯的数目。
首先你得知道什么叫信号量,什么时候要用信号量。
这个嘛,主要就是用来保护共享资源的,也就是说如果你想限制某个(些)资源在同一时刻只能有一(多)个线程拥有,就可以使用信号量。当然也可以用作让一个线程等待另一个线程完成某项工作。
用下面一组函数(系统调用)来实现。
int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem);
具体要Include什么头文件,在你的系统上man sem_init吧。
这组函数是POSIX标准的无名信号量函数,另外还有具名信号亮,这个嘛,等下回再说。
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。
OK?
另外几个函数sem_trywait ,顾名思义,望文生义,就是测试一下看看现在有没有可用的信号灯,而不会阻塞。
sem_getvalue嘛就是读取当前的信号灯的数目。
相关文章推荐
- 信号量sem_wait()的使用
- 信号量sem_wait()的使用
- linux 进程间信号量管理程序之sem_timedwait使用
- linux 进程间信号量管理程序之sem_timedwait使用
- 信号量sem_wait()的使用
- 信号量 sem_timedwait 函数的使用
- sem_wait,sem_post与信号量
- 信号量down, up, sem_p, sem_v, sem_wait, sem_post 的区别
- sem_init,sem_post,sem_wait 信号量的用法解释
- sem_init,sem_post,sem_wait 信号量的用法解释
- 信号量sem_t\sem_init\sem_post\sem_wait\sem_destroy
- 信号量sem_t,互斥锁pthread_mutex_t的使用
- 信号量释放和等待函数sem_post()和sem_wait()
- 信号量sem_init,sem_wait,sem_post
- 信号量sem_wait 线程信号量相关操作
- 关于信号量sem_wait的整理(转)
- 使用sem_post信号量进行线程同步
- 内核sem、wait_queue_head_t、timer和kernel_thread使用驱动范例
- 多线程使用信号量sem_init,sem_wait,sem_post
- java中wait 信号量和notify信号量的使用