• 技术文章 >运维 >linux运维

    linux中条件变量和信号量有什么区别

    青灯夜游青灯夜游2022-05-11 19:18:34原创232

    区别: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)信号量的意图在于进程间同步,互斥锁和条件变量的意图在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。应当根据实际的情况进行决定。信号量最有用的场景是用以指明可用资源的数量。

    经典的一句话:

    互斥量是信号量的一种特例,互斥量的本质是一把锁。

    相关推荐:《Linux视频教程

    以上就是linux中条件变量和信号量有什么区别的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:linux
    上一篇:linux中less和more的区别有哪些 下一篇:linux字符设备有哪些
    千万级数据并发解决方案

    相关文章推荐

    • linux x是什么权限• linux怎么安装oracle jdk• linux为什么比windows安全• linux数据分析工具有哪些• linux中sed和awk有什么区别
    1/1

    PHP中文网