条件(也称为条件队列 或条件变量)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通知它之前,一直挂起该线程(即让其“等待”)。因为访问此共享状态信息发生在不同的线程中,所以它必须受保护,因此要将某种形式的锁与该条件相关联。等待提供一个条件的主要属性是:以原子方式 释放相关的锁,并挂起当前线程,就像 Object.wait 做的那样
在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现。
条件变量类似JDK1.4或以前版本中的 Object.wait(); Object.notify(); Object.notifyAll();
值得注意的是当condition.await()时,隐式的将条件变量关联的Lock解锁,而使其他线程有机会获得Lock,而检查条件,并在条件满足时,等待在条件变量上。
示例代码,ArrayBlockingQueue源码摘取:
/** Main lock guarding all access */
private final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;
/**
* Inserts the specified element at the tail of this queue, waiting
* for space to become available if the queue is full.
*
* @throws InterruptedException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public void put(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
final E[] items = this.items;
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
try {
while (count == items.length)
notFull.await();
} catch (InterruptedException ie) {
notFull.signal(); // propagate to non-interrupted thread
throw ie;
}
insert(e);
} finally {
lock.unlock();
}
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
try {
while (count == 0)
notEmpty.await();
} catch (InterruptedException ie) {
notEmpty.signal(); // propagate to non-interrupted thread
throw ie;
}
E x = extract();
return x;
} finally {
lock.unlock();
}
}
有多个线程往里面存数据和从里面取数据,其队列(先进先出后进后出)能缓存的最大数值是capacity,多个线程间是互斥的,当缓存队列中存储的值达到capacity时,将写线程阻塞,并唤醒读线程,当缓存队列中存储的值为0时,将读线程阻塞,并唤醒写线程
这就是多个Condition的强大之处,假设缓存队列中已经存满,那么阻塞的肯定是写线程,唤醒的肯定是读线程,相反,阻塞的肯定是读线程,唤醒的肯定是写线程,那么假设只有一个Condition会有什么效果呢,缓存队列中已经存满,这个Lock不知道唤醒的是读线程还是写线程了,如果唤醒的是读线程,皆大欢喜,如果唤醒的是写线程,那么线程刚被唤醒,又被阻塞了,这时又去唤醒,这样就浪费了很多时间!
本篇非原创转自:
http://cuisuqiang.iteye.com/blog/2019251
分享到:
相关推荐
在Java中,条件变量是`java.util.concurrent.locks.Condition`接口的实现,通常与锁(如`ReentrantLock`)一起使用。在C++的`std::condition_variable`库中,也有类似的实现。下面我们将深入探讨条件变量的概念、...
Java通过java.util.concurrent.locks包中的Condition接口提供了条件变量的实现。本文将详细介绍Condition接口的工作原理、使用方法以及如何在实际项目中应用它。 Condition接口是Java并发编程中实现等待/通知模式的...
下面,我们将详细解释互斥锁和条件变量的工作机制、使用场景和注意事项。 互斥锁(Mutex) 互斥锁是最基本的同步机制,它用于保护共享资源免受多个线程同时访问的干扰。互斥锁可以是普通锁(PTHREAD_MUTEX_TIMED_...
本示例着重讲解如何利用C++标准库中的互斥锁(mutex)和条件变量(condition variable)进行线程同步,并实现跨平台的封装。这些工具是多线程编程中的关键组成部分,用于确保共享资源的安全访问。 首先,让我们了解...
条件变量(Condition Variable)则是为了解决这一问题而引入的。条件变量允许线程在资源不满足其工作条件时,主动释放锁并进入等待状态。其他线程可以在适当的时候唤醒这些等待的线程。条件变量通常与互斥锁一起使用...
本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...
2. **条件变量(Condition Variable)**: 条件变量允许进程在特定条件满足时才继续执行。它与互斥锁配合使用,可以在等待某个条件时,释放锁并进入休眠状态,条件改变时,由其他进程唤醒。在C语言中,`pthread_...
条件变量通常与互斥锁(mutex)一起使用,以避免竞争条件(Race Condition)和确保线程间的同步。本篇讲解将详细介绍Linux条件变量的基本概念、使用方法及其相关函数。 首先,条件变量是一种线程间通信的同步机制,...
std::condition_variable 是 C++11 标准中 <condition_variable> 头文件里的一个类,用于实现条件变量的功能。条件变量是一种同步机制,允许线程在某个条件下等待或被唤醒。 std::condition_variable 的主要功能是...
C++多线程中的锁和条件变量使用教程 在C++多线程编程中,锁和条件变量是两个非常重要的概念,它们都是用于解决多线程之间的同步和通信问题的。下面我们将详细地介绍锁和条件变量的使用。 一、锁(Mutex) 锁是多...
条件变量(Condition Variable): 条件变量允许线程在特定条件满足时才继续执行。在实现线程池时,可能使用条件变量来通知线程何时有新任务到来或者线程池是否已关闭。线程可以等待条件变量,只有当其他线程改变...
条件变量(Condition Variables)是线程同步的一种工具,它允许线程在满足特定条件时等待,只有当其他线程改变了这个条件,等待的线程才会被唤醒。条件变量与互斥锁(Mutexes)配合使用,可以实现更灵活的线程同步...
例如,你可以通过执行SQL(如`SELECT tablename FROM sometable WHERE condition`)获取表名,然后使用`row.setVariable("tableName", tablename);`将结果存入变量。 3. **使用变量**:在另一个“表输入”步骤中,...
在多线程编程中,线程间的通信是非常重要的,条件变量(Condition Variables)是POSIX线程(pthread)库提供的一种同步机制,它允许线程在特定条件满足时才能继续执行。在Linux系统编程中,条件变量通常与互斥锁...
Python中的线程条件变量(Condition)是多线程编程中的一种同步机制,它允许线程在特定条件下等待,直到其他线程改变这个条件并通知它们。条件变量通常与锁一起使用,确保在进行条件检查和操作时数据的一致性。 在...
在多线程编程中,条件变量(Condition Variables)是一个重要的同步机制,用于线程间的通信和协调。条件变量允许线程等待某个特定条件的发生,并在条件满足时被其他线程唤醒。然而,条件变量存在一个特性,即虚假...
Condition_Variable 的构造函数中初始化了条件变量,并在析构函数中销毁了条件变量。 Condition_Variable 的 wait() 函数使用 pthread_cond_wait() 函数来实现等待操作,而 notify_one() 和 notify_all() 函数使用...
本文将详细解析如何利用多线程、互斥锁(mutex)以及条件变量(condition variable)来实现特定的“abb”输出模式。我们将通过分析提供的“abb_out.sln”解决方案文件和“abb_out”源代码文件,探讨这一技术的应用。...
在 Nachos 操作系统中,条件变量是通过 Condition 类来实现的。 Condition 类中有三个主要的方法:Wait()、Signal() 和 BroadCast()。Wait() 方法用于线程等待条件变量的出现,当前线程将释放锁并进入睡眠状态。...