Mutex : 锁   同一时间只允许一个线程访问其代码内容

拟人 : 就是一把锁而已,可以lock unlock, 谁都可以拿到锁,打开门进屋,但进去后,就会把门锁上(lock) 别人想进就得等他出来(unlock).

Condition_variable : 条件变量    用来阻塞线程, 在收到信号 或 满足某条件 或 等待超过某设定的时间 时继续运行线程

拟人 : 相当于 拿着锁 (用锁来初始化) 的保安同志.. 他拿着锁,有权力控制门的打开与关闭,他是按着上级的 指示/时间/条件 才会打开大门的

 #include <iostream>
#include <condition_variable>
#include <thread>
using namespace std; // 条件变量
condition_variable cv;
// 锁
mutex m;
// 这个值 是0 还是1 决定了哪个线程运行 哪个线程阻塞
int currentAppend = ; // 线程1
void append_1() {
// 线程1的锁
unique_lock<mutex> lock(m);
for (size_t i = ; i < ; i++)
{
/*
用锁来初始化条件变量并阻塞,后面跟的是一个谓语表达示
也就是说,在满足什么条件的时候(返回True),线程才能继续运行
这里就是在 currentAppend 为 1 的时候继续
*/
cv.wait(lock, []{return currentAppend == ; });
cout << "append " << << endl;
// 在这里改变了条件(也就是将值改为了0)
currentAppend = ;
// 这是条件变量在做完一些操作的时候,告诉其它的正在阻塞的线程
// 你们可以继续了
cv.notify_one();
}
} // 线程2
void append_0() {
// 线程2的锁
unique_lock<mutex> lock(m);
for (size_t i = ; i < ; i++)
{
// 同上方解释
cv.wait(lock, []{return currentAppend == ; });
cout << "append " << << endl;
currentAppend = ;
cv.notify_one();
}
} int main() {
// 创建两个线程
thread th_0(append_0);
thread th_1(append_1); // 等待两个线程运行完成
th_0.join();
th_1.join(); return ;
}

C++ 0x 使用condition_variable 与 Mutex 同步两个线程的更多相关文章

  1. C# 使用 AutoResetEvent 或 ManualResetEvent 同步两个线程

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. c+11 std::condition_variable and mutex

    multiple threads synchronization primitive: 多线程同步语义 多线程的同步语义是多线程编程的核心,线程之间通过同步语义进行通信,实现并发.C++ JAVA 中 ...

  3. C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)

    本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...

  4. 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?

    一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...

  5. 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】

    方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * ...

  6. 关于跨DB增量(增、改)同步两张表的数据小技巧

    有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...

  7. 通过FEDERATED存储引擎同步两实例间的表数据

    需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据. 方案:通过FEDERATED来完成跨势力的查询FEDERATED存储引擎表只会创建表结构,不会存储表数据, ...

  8. Oracle:同步两张表的相同字段

    有一个需求需要同步两张表的相同字段,比如表A和表B,这两张表是不同的用户下的表,表结构是一样的. 一开始我简单写了一个sql语句,如下: update ord_log1 A set (A.pid, A ...

  9. 加深对AQS原理的理解示例二:自己设计一个同步工具,同一时刻最多只有两个线程能访问,超过线程将被阻塞

    /** *@Desc 设计一个同步工具,同一时刻最多只有两个线程能访问,超过线程将被阻塞<br> * 思路分析: * 1.共享锁 两个线程及以内能成功获取到锁 * 2. *@Author ...

随机推荐

  1. 【appium】keyevent的keycode

    方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66); 方法2 HashMap<String, Integer> ke ...

  2. 转换sql文件的create table语句为drop table语句

    package com.csii.pweb.query.action; import java.io.BufferedReader; import java.io.FileNotFoundExcept ...

  3. Python数据结构算法

    Python内置了许多非常有用的数据结构,比如列表(list),集合(set)以及字典(dictionary).就绝大部分情况而言,我们可以直接使用这些数据结构.但是,我们通常还要考虑比如搜索,排序, ...

  4. bzoj1864 三色二叉树

    Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 记录每个节点染 ...

  5. 学习笔记之IKM C++ 11

    https://github.com/haotang923/interview/tree/master/IKM Q1. If most of the calls to function foo() b ...

  6. Jquery判断IE6等浏览器的代码

    这好像是由几篇代码接在一起的,原文均来自网络,不记得出处了~ jquery中利用navigator.userAgent.indexOf来判断浏览器类型,并进行了一下处理,如果不想使用jquery,稍为 ...

  7. linux开机服务自启

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务,主要用三种方式进行这一操作: ln -s             在/etc/rc.d/rc*.d目录中建立/etc/init.d/ ...

  8. 浅谈在Java开发中的枚举的作用和用法

    枚举(enum),是指一个经过排序的.被打包成一个单一实体的项列表.一个枚举的实例可以使用枚举项列表中任意单一项的值.枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色.方式.类别.状态等等数目 ...

  9. numpy的flat、flatten、ravel

    import numpy as np dt = np.arange(10).reshape(5,2) # =============================================== ...

  10. 递归神经网络(Recursive Neural Network, RNN)

    信息往往还存在着诸如树结构.图结构等更复杂的结构.这就需要用到递归神经网络 (Recursive Neural Network, RNN),巧合的是递归神经网络的缩写和循环神经网络一样,也是RNN,递 ...