`
kenby
  • 浏览: 723763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正确使用pthread_cond_wait

阅读更多

消费者的两种等待方式:

方式1: 

if (empty(queue)) {

    pthread_cond_wait(&queue_has_element, &mutex);

}

element = dequeue(queue);


方式2:

while (empty(queue)) {

    pthread_cond_wait(&queue_has_element, &mutex);

}

element = dequeue(queue);


说明:

方式1的等待存在问题, 如果多个消费者都在等待queue_has_element, 此时, 生产者产生

一个元素, 并调用pthread_cond_broadcast把所有消费者都惊醒, 而元素确只有一个, 这

意味着只有一个消费者可以得到这个元素, 其余消费者应该继续等. 但是方式1. 所有消费者

不等待, 去一个空队列取元素将会发生错误. 方式2是正确的处理方式. 每个消费者醒了之后,

还会检查一次队列, 如果队列依然为空, 则继续等待... 


PS: 如果使用pthread_cond_broadcast来广播信号, 条件变量满足后, 不一定真的代表资

源满足. 只有在使用pthread_cond_signal的情况下, 条件变量的满足才意味着资源也满足.

 

 

分享到:
评论

相关推荐

    pthread_cond_wait() 用法深入分析

    线程可以使用 `pthread_cond_wait()` 或 `pthread_cond_timedwait()` 进行等待。前者无条件等待,直到接收到信号才会继续执行;后者带有超时限制,如果在指定的时间内条件未满足,线程会返回 `ETIMEDOUT`。 在调用 ...

    信号pthread_cond_wait

    总结,`pthread_cond_wait`是多线程编程中实现线程同步的重要工具,正确理解和使用它能够帮助我们编写出高效、可靠的多线程程序。然而,由于其涉及到复杂的线程交互,因此在使用时需要特别注意避免死锁和无效等待,...

    为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.Linux 多线程

    在使用`pthread_cond_wait()`时,通常会在调用它之前加入一个while循环来判断条件是否满足。这个做法是为了避免虚假唤醒(spurious wakeups)的问题,确保线程只有在正确的情况下才会继续执行。现在我们详细讨论一下...

    Linux多线程之条件阻塞代码

    在这个主题中,我们将深入探讨如何使用互斥锁(mutex)和条件变量(pthread_cond_wait, pthread_cond_signal)来实现线程间的同步和通信,从而解决条件阻塞的问题。 1. **互斥锁(Mutex)** 互斥锁是一种同步机制...

    Linux多线程编程,替代sleep的几种方式

    我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能达不到,我们想要的效果...  采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timesp

    pthread_cond

    7. **错误处理**:在使用`pthread_cond`时,要注意可能出现的错误,如资源不足、信号量未正确初始化等。对这些错误进行妥善处理,可以保证程序的健壮性。 通过以上分析,我们可以看出`pthread_cond`在多线程编程中...

    Posix(1).rar_POSIX Pthread_posix_pthread_pthread posix

    6. **线程间通信**:`pthread_cond_broadcast()`、`pthread_cond_signal()`和`pthread_cond_wait()`等函数用于线程间的通信,协调工作进度。 7. **线程局部存储**:`pthread_key_create()`和`pthread_getspecific()...

    pthreads_pthread_

    5. `pthread_cond_t` 和 `pthread_cond_init() / pthread_cond_wait() / pthread_cond_signal() / pthread_cond_broadcast()`:条件变量,用于线程间通信和同步,当满足特定条件时,一个线程通知其他等待线程。...

    pthread-primer.rar_Pthread Primer pdf_pthread_pthread primer

    create()`用于创建新的线程,`pthread_join()`用于等待线程结束,`pthread_mutex_t`和`pthread_mutex_lock()`、`pthread_mutex_unlock()`用于互斥锁,保证资源的安全访问,`pthread_cond_t`和`pthread_cond_wait()`...

    Windows可使用的pthread库

    - **条件变量**:允许线程等待某个特定条件满足后再继续执行,例如`pthread_cond_wait`和`pthread_cond_signal`。 - **读写锁**:允许多个线程同时读取共享数据,但只允许一个线程进行写操作,如`pthread_rwlock_...

    pthread_self获取当前调用线程的识别码

    4. **条件变量**:在使用 `pthread_cond_wait` 和 `pthread_cond_signal` 等条件变量函数时,也需要用到 `pthread_self` 来确定发送信号或等待的线程。 5. **线程退出**:有时,你需要知道哪个线程正在执行特定的...

    pthread(arm_linux).zip_ARM Linux_arm_arm linux pthread_arm pthre

    常用函数有`pthread_cond_init()`、`pthread_cond_wait()`和`pthread_cond_signal()`。 3. 信号量:一种计数型同步机制,可以实现线程间的资源控制和同步。`sem_open()`、`sem_post()`和`sem_wait()`等函数用于信号...

    2_pthread_sync.tgz

    线程可以使用`pthread_cond_wait`函数等待条件变量,并在条件满足时通过`pthread_cond_signal`或`pthread_cond_broadcast`唤醒等待的线程。条件变量常与互斥锁配合使用,防止信号发送时的数据不一致。 3. **信号量*...

    windows 下的pthread 库

    - **条件变量**(Condition Variable):`pthread_cond_t`表示条件变量,`pthread_cond_init()`和`pthread_cond_destroy()`用于初始化和销毁,`pthread_cond_wait()`和`pthread_cond_signal()`或`pthread_cond_...

    linux pthread 多线程控制示例代码

    通过`pthread_create()`创建线程,然后使用`pthread_join()`等待线程结束,可能还会有条件变量`pthread_cond_t`的使用,如`pthread_cond_wait()`和`pthread_cond_timedwait()`,以实现线程间的协作。`sleep()`函数...

    Linux系统编程-(pthread)线程通信(条件变量).pdf

    - 初始化与销毁:`pthread_cond_init`用于初始化条件变量,完成使用后需调用`pthread_cond_destroy`销毁。 - 等待与唤醒: - `pthread_cond_wait`:线程调用此函数会释放已持有的互斥锁,进入等待状态,直到其他...

    互斥锁与条件变量详解 疑问全解

    在调用pthread_cond_wait()前,mutex必须被锁定,以防止多个线程同时请求pthread_cond_wait()的竞争条件(Race Condition)。 条件变量(Condition Variable) 条件变量是一种同步机制,它允许线程在满足特定条件...

    数码天空破解文件cccam205

    libpthread.so.0 pthread_cond_wait recv connect pthread_create send accept pthread_cond_signal pthread_cond_init pthread_mutex_unlock pthread_mutex_lock pthread_mutex_init _Jv_RegisterClasses close ...

Global site tag (gtag.js) - Google Analytics