Linux下条件变量和信号量分别是什么意思
Admin 2022-07-21 群英技术资讯 784 次浏览
区别:1、使用条件变量可以一次唤醒所有等待者,而信号量不能唤醒;2、信号量始终有一个值(状态),而条件变量是没有值的,没有地方记录发送信号的次数,也没有地方记录wait返回的次数;3、信号量的意图在于进程间同步,条件变量意图在于线程间同步。
本教程操作环境:linux5.9.8系统、Dell G3电脑。
条件变量
条件变量(cond)使在多线程程序中用来实现“等待--->唤醒”逻辑常用的方法,是进程间同步的一种机制。条件变量用来阻塞一个线程,直到条件满足被触发为止,通常情况下条件变量和互斥量同时使用。
一般条件变量有两个状态:
(1)一个/多个线程为等待“条件变量的条件成立“而挂起;
(2)另一个线程在“条件变量条件成立时”通知其他线程。
条件变量的使用:
#include <pthread.h> struct msg { struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); }
当然,在触发条件变量时也可以用以下代码,两种方式各有优劣
void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }
信号量
信号量是一种特殊的变量,访问具有原子性。
只允许对它进行两个操作:
(1)等待信号量
当信号量值为0时,程序等待;当信号量值大于0时,信号量减1,程序继续运行。
(2)发送信号量
将信号量值加1。
说明:Linux提供了一组信号量API,声明在头文件sys/sem.h中。
linux 条件变量和信号量的区别:
(1)使用条件变量可以一次唤醒所有等待者,而这个信号量没有的功能,感觉是最大区别。
(2)信号量始终有一个值(状态的),而条件变量是没有的,没有地方记录唤醒(发送信号)过多少次,也没有地方记录唤醒线程(wait返回)过多少次。从实现上来说一个信号量可以是用mutex + counter + condition variable实现的。因为信号量有一个状态,如果想精准的同步,那么信号量可能会有特殊的地方。信号量可以解决条件变量中存在的唤醒丢失问题。
(3)信号量的意图在于进程间同步,互斥锁和条件变量的意图在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。应当根据实际的情况进行决定。信号量最有用的场景是用以指明可用资源的数量。
经典的一句话:
互斥量是信号量的一种特例,互斥量的本质是一把锁。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在linux中,32位平台和64位平台中的short都占2个字节;linux中只有long长整型、void(c语言中,void为“不确定类型”)在32位中是4个字节,在64位中是8个字节。
今天给大家分享的是关于linux下的cd命令的内容,小编觉得cd命令比较实用,因此分享给大家做个参考。linux下的cd命令可以用来切换当前工作目录,那么具体怎样使用cd命令呢?接下来我们详细的了解看看。
centos中安装mysql详细步骤说明
linux锁的种类:1、mutex(互斥锁),用于保证在任何时刻,都只能有一个线程访问该对象;2、rwlock(读写锁),分为读锁和写锁,适用于读取数据的频率远远大于写数据的频率的场合;3、spinlock(自旋锁),在任何时刻同样只能有一个线程访问对象;4、seqlock(顺序锁),用于能够区分读与写的场合,并且是读操作很多、写操作很少,写操作的优先权大于读操作。
linux返回根目录命令的方法:首先把系统打开,右键选最后终端机,输入切换命令;然后输入切换命令【cd /】回车就可以切换到根目录。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008