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

多线程的pthread_cond_wait后,记住再次检测条件

阅读更多

一般来说,在多线程竞争一个资源的时候,会用到pthread_cond_wait,pthread_cond_signal机制,典型的做法就是在一个使用这个资源的线程(消费者)里面,判断资源如果不可用的话,则pthread_cond_wait,在另外一个线程(生产者)中判断如果资源可用的话,则发一个pthread_cond_signal或者pthread_cond_broadcast通知wait的线程。

 

但是有一个问题,就是在wait成功后,实际上此时的资源是否就一定可用呢?答案是否定的,如果存在两个线程同时使用这个资源的话,wait返回后,有可能资源已经被使用了。所以在这种情况下,判断资源是否可用,应该用如下模型:

 

while (resource==TRUE)       

{               

           pthread_cond_wait( &COND, &MUTEX);          

}

 

这里用了while,而不是用if,原因就是上面提到的。当然,如果在应用中,只有一个消费者,就可以直接用if了。 要搞清楚这个问题背后的问题,就需要知道pthread_cond_wait的实际过程。 当发起一个pthread_cond_wait之后,分解后,实际上是三个动作:    

1、解锁    

2、等待 当收到一个解除等待的信号(pthread_cond_signal或者pthread_cond_broad_cast)之后,pthread_cond_wait马上需要做的动作是:    

3、上锁

 

了解这个原理后,假设出现如下场景:如果消费者A的wait在收到解除信号后,去上锁,但是这个时候,被消费者B先上锁,把资源使用掉了,然后解锁,然后消费者A上锁成功,wait返回,而此时资源已经不可用了,所以消费者A必须在判断一下资源的可用性。

分享到:
评论

相关推荐

    pthread_cond_wait() 用法深入分析

    这个锁在调用 `pthread_cond_wait()` 时会被自动释放,然后在线程准备恢复执行之前再次获得,以确保线程安全地重新进入临界区。 激发条件有两种方式: - `pthread_cond_signal()` 发送一个信号,唤醒一个等待该条件...

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

    1. **虚假唤醒**:在多线程环境中,`pthread_cond_wait()`可能会在没有被信号(signal)唤醒的情况下返回,即条件未满足时线程被随机地唤醒,这种情况称为虚假唤醒。虽然这种现象在实践中较为罕见,但为了程序的健壮...

    信号pthread_cond_wait

    《深入理解pthread_cond_wait:多线程同步的关键》 在多线程编程中,线程间的同步至关重要,而`pthread_cond_wait`就是一种用于线程间同步的重要工具,它属于POSIX线程库(pthread)的一部分。这个函数使得一个线程...

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

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

    Linux多线程之条件阻塞代码

    在多线程环境中,如果线程A需要等待某个条件满足才能继续执行,它会调用`pthread_cond_wait()`,释放互斥锁并进入等待状态。此时,其他线程可以获取锁并修改共享数据,使得条件得以满足。一旦条件满足,另一个线程B...

    pthread_cond

    在POSIX线程库(pthread)中,`pthread_cond`是一个关键的概念,它涉及到多线程编程中的同步机制。条件变量允许线程等待特定条件的发生,而不是无休止地占用CPU资源。这样的机制使得线程可以高效地协作,提高系统的...

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

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

    linux pthread 多线程控制示例代码

    在Linux操作系统中,多线程编程是通过POSIX线程库(pthread)来实现的,这个库提供了一套丰富的API,使得开发者可以在单个进程中创建并管理多个执行线程。`pthread`是POSIX标准的一部分,它允许程序员创建轻量级进程...

    pthread_pthread_

    - **条件变量(Condition Variables)**:`pthread_cond_t`用于线程间的通信和同步,`pthread_cond_wait()`使线程等待,`pthread_cond_signal()`或`pthread_cond_broadcast()`唤醒等待的线程。 - **信号量...

    Posix(1).rar_POSIX Pthread_posix_pthread_pthread posix

    在给定的压缩包文件“Posix(1).rar”中,重点是关于POSIX线程(pthread)的编程指南,这对于理解和开发多线程应用程序在Linux环境下至关重要。 POSIX线程,也称为pthreads,是POSIX标准的一部分,它提供了一种跨...

    pthreads_pthread_

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

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

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

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

    在多线程编程中,线程间的通信是非常重要的,条件变量(Condition Variables)是POSIX线程(pthread)库提供的一种同步机制,它允许线程在特定条件满足时才能继续执行。在Linux系统编程中,条件变量通常与互斥锁...

    pthread-primer.rar_Pthread Primer pdf_pthread_pthread primer

    join()`用于等待线程结束,`pthread_mutex_t`和`pthread_mutex_lock()`、`pthread_mutex_unlock()`用于互斥锁,保证资源的安全访问,`pthread_cond_t`和`pthread_cond_wait()`、`pthread_cond_signal()`用于条件变量...

    Linux多线程之同步.docx

    - **等待(pthread_cond_wait())**:当线程需要等待某个条件成立时,调用 `pthread_cond_wait()`。这个函数会先释放互斥锁,然后挂起当前线程。只有在其他线程对条件变量发出信号或广播后,该线程才能重新获得锁并...

    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()`等函数用于信号...

    Windows可使用的pthread库

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

    2_pthread_sync.tgz

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

Global site tag (gtag.js) - Google Analytics