zoukankan      html  css  js  c++  java
  • pthread_cond_wait() 函数的使用

    1. 首先pthread_cond_wait 的定义是这样的

    The pthread_cond_wait() and pthread_cond_timedwait() functions are used to block on a condition variable. They are called with mutex locked by the calling thread or undefined behaviour will result.

    These functions atomically release mutex and cause the calling thread to block on the condition variablecond; atomically here means "atomically with respect to access by another thread to the mutex and then the condition variable". That is, if another thread is able to acquire the mutex after the about-to-block thread has released it, then a subsequent call to pthread_cond_signal() or pthread_cond_broadcast() in that thread behaves as if it were issued after the about-to-block thread has blocked.

    2. 由上解释可以看出,pthread_cond_wait() 必须与pthread_mutex 配套使用。

    pthread_cond_wait()函数一进入wait状态就会自动release mutex.

    In Thread1:

    pthread_mutex_lock(&m_mutex);   
    pthread_cond_wait(&m_cond,&m_mutex);   
    pthread_mutex_unlock(&m_mutex);  

    In Thread2:

    pthread_mutex_lock(&m_mutex);   
    pthread_cond_signal(&m_cond);   
    pthread_mutex_unlock(&m_mutex);  

    为什么要与pthread_mutex 一起使用呢? 这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 进入wait_cond状态 并自动释放mutex) 的时候才能调用cond_singal.

    3.

    pthread_cond_wait() 一旦wait成功获得cond 条件的时候会自动 lock mutex.

    这就会出现另一个问题。这是因为

    The pthread_cond_wait() and pthread_cond_timedwait()  is a cancellation point.

    In Thread3:

    pthread_cancel(&m_thread);

    pthread_join();

    因为pthread_cond_wait() and pthread_cond_timedwait()  是线程退出点函数,因此在Thread3中

    可以调用pthread_cancel()来退出线程1。那样显然线程1会在pthread_cond_wait(&m_cond,&m_mutex);   和 pthread_mutex_unlock(&m_mutex); 之间退出,    pthread_cond_wait() 函数返回后自动lock住了mutex, 这个时候线程1退出(并没有运行到pthread_mutex_unlock()),如果Thread2这个时候就再也得不到lock状态了。

    通常解决这个问题的办法如下

    void cleanup(void *arg)
    {
      pthread_mutex_unlock(&mutex);
    }
    void* thread1(void* arg)
    {
      pthread_cleanup_push(cleanup, NULL);  // thread cleanup handler
      pthread_mutex_lock(&mutex);
      pthread_cond_wait(&cond, &mutex);
      pthread_mutex_unlock(&mutex);
      pthread_cleanup_pop(0);
    }

  • 相关阅读:
    RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
    Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新
    自定义支持多种格式可控范围的时间选择器控件
    UIWebView 操作
    iOS 模拟器键盘弹出以及中文输入
    验证 Xcode 是否来自正规渠道
    使用 AFNetworking 进行 XML 和 JSON 数据请求
    Reveal UI 分析工具分析手机 App
    多种方式实现文件下载功能
    网站HTTP升级HTTPS完全配置手册
  • 原文地址:https://www.cnblogs.com/bigben0123/p/3227251.html
Copyright © 2011-2022 走看看