(二)内核锁的使用之信号量【转】

简介:

转自:http://blog.csdn.net/lixiaojie1012/article/details/23708377

信号量是一种睡眠锁,也就是说我调用了获取信号量的接口,但是这个时候信号量获取不到,那么对应的任务就会睡眠,从而让出cpu运行其他程序;一旦有人释放的信号量,都会重新出发任务调度,能获取到信号量的任务就会得到机会执行。上节中所说的自旋锁是非睡眠锁,他会一直占有CPU直到获取到对应的锁。

 

1、计数信号量

 

计数信号量创建时,资源可以设置为大于1,这个时候就可以有多个任务获取到信号量从而得到访问资源的机会;举个例子,银行有5个业务窗口,这就好比值为5的信号量,这个时候可以有5个人可以同时得到服务,第6个往后就得等待信号量的释放了,直到有人办完业务(释放信号量),他才能去办理业务(访问资源);

 

2、二值信号量

 

如果计数信号量的值为1,那么就是二值信号量了,他可以用来做同步,也可以用来做互斥;

作为同步使用时,通常是中断和任务搭配完成的,任务一般是一个死循环,最开始是一个down信号量的操作,通常情况下任务会卡在此处,当配对的中断到来时,也就意味着任务到了运行的时机,这个时候中断上下文中会释放一个信号量,中断上下文退出时,任务就会被调度到执行。

 

此外,内核中还有一种同步方法叫完成变量;对应的接口分别是wait_for_completion()和complete(),主要使用在一个任务发出信号通知另一任务发生了某个特定事件,从而使两个任务得到同步;等待方调用wait_for_completion(),通知方调用complete(),函数声明在<linux/completion.h>中,感兴趣的同学可以去看一下具体实现。










本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5333663.html,如需转载请自行联系原作者

相关文章
|
3月前
|
Linux 程序员 API
POSIX互斥锁自旋锁
POSIX互斥锁自旋锁
40 0
|
3月前
|
Linux
【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu
【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu
|
2月前
|
Linux
Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
72 0
Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
|
10月前
|
存储 缓存 安全
Linux下线程同步(带你了解什么是互斥锁、死锁、读写锁、条件变量、信号量等)
Linux下线程同步(带你了解什么是互斥锁、死锁、读写锁、条件变量、信号量等)
122 0
|
11月前
|
存储 网络协议 API
4-FreeRTOS队列、互斥、信号量
4-FreeRTOS队列、互斥、信号量
使用共享内存作为进程互斥锁的代码
使用共享内存作为进程互斥锁的代码
82 0
|
调度
详解线程的信号量和互斥锁
  前言:有个问题感觉一直会被问道:进程和线程的区别?也许之前我会回答: 进程:资源分配最小单位 线程:轻量级的进程 是系统调度的最小单位 由进程创建 多个线程共享进程的资源   但是现在我觉得一个比喻回答的更好:程序就像静止的火车,进程是运行的火车,线程是运行火车的每节车厢。
1082 0
|
Go 调度 C语言
进程&线程间通信:信号量
参考文档:http://blog.csdn.net/evsqiezi/article/details/8061176头文件:#include int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。
1152 0

热门文章

最新文章