zoukankan      html  css  js  c++  java
  • 条件变量

    关于条件变量最核心的函数是pthread_cond_wait

    这个函数不太容易理解的地方在于,它会在使进程陷入休眠之前解锁互斥量,而又在进入休眠之后重新锁定互斥量,相当于在函数内部是这样的:

    unlock()

    sleep

    lock();

    所以这个函数调用的时候也很奇怪,先是要锁定住互斥量,然后陷入等待,函数返回之后又要手动解锁互斥量

    第二个问题在于条件变量使用的时候总要附加一个普通的变量(比如一个bool   flag)

    而且使用的时候是这样的

    pthread_cond_t qready  = PTHREAD_COND_INITIALIZER;

    pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;

    bool flag = false;

    pthread_mutex_lock(&qlock);

    while(!flag)

      pthread_cond_wait(&qready, &qlock);

    pthread_mutex_unlock(&qlock);

    ....

    这几乎是一种惯例了,为什么?

    关于互斥量加锁与解锁的部分很清晰了,只是flag似乎只是一个普通的变量,在这里承担什么角色?返回之后,flag仍然为false的话,又要陷入等待??

    这就关乎到一个竞争条件了,pthread_cond_t只是提供了一套基础设置,等待它的就绪,其实只是通过wai使得线程陷入休眠而已,并不是说

    内部不停在测试qready的值什么的,而进程解除休眠需要别的进程调用pthread_cond_signal或pthread_cond_broadcast

    也就说,条件变量的提供的是一套基础设施,关键的我们需要关心的条件是什么时候调用pthread_cond_signal或pthread_cond_broadcast,这就

    是应用程序自己定义的问题了,比如这里,我们在另一个线程里发现flag = true,于是发通知告知所有阻塞在这个条件上的线程.

    那么休眠返回后为啥要再测一下flag呢?其实是为了防止返回的之后,条件又变为false了,再次发现多线程程序里的竞争条件层出不穷!

  • 相关阅读:
    JMeter:全面的乱码解决方案
    代码静态扫描工具sonar
    jmeter接口测试
    MVC模式
    Android--HttpClient
    android SQLite使用SQLiteOpenHelper类对数据库进行操作
    反射
    列约束
    MVC的处理过程
    android项目中values中几个文件的作用
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4822188.html
Copyright © 2011-2022 走看看