C++ 0x 使用condition_variable 与 Mutex 同步两个线程
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 同步两个线程的更多相关文章
- C# 使用 AutoResetEvent 或 ManualResetEvent 同步两个线程
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- c+11 std::condition_variable and mutex
multiple threads synchronization primitive: 多线程同步语义 多线程的同步语义是多线程编程的核心,线程之间通过同步语义进行通信,实现并发.C++ JAVA 中 ...
- C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)
本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...
- 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?
一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...
- 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】
方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * ...
- 关于跨DB增量(增、改)同步两张表的数据小技巧
有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...
- 通过FEDERATED存储引擎同步两实例间的表数据
需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据. 方案:通过FEDERATED来完成跨势力的查询FEDERATED存储引擎表只会创建表结构,不会存储表数据, ...
- Oracle:同步两张表的相同字段
有一个需求需要同步两张表的相同字段,比如表A和表B,这两张表是不同的用户下的表,表结构是一样的. 一开始我简单写了一个sql语句,如下: update ord_log1 A set (A.pid, A ...
- 加深对AQS原理的理解示例二:自己设计一个同步工具,同一时刻最多只有两个线程能访问,超过线程将被阻塞
/** *@Desc 设计一个同步工具,同一时刻最多只有两个线程能访问,超过线程将被阻塞<br> * 思路分析: * 1.共享锁 两个线程及以内能成功获取到锁 * 2. *@Author ...
随机推荐
- 学hadoop需要什么基础
最近一段时间一直在接触关于hadoop方面的内容,从刚接触时的一片空白,到现在也能够说清楚一些问题.这中间到底经历过什么只怕也就是只有经过的人才会体会到吧.前几天看到有个人问“学hadoop需要什么基 ...
- MFC的组合框(ComboBox)控件切换下拉样式
由于课题的需求需要做MFC串口程序,看了百度下载的串口助手的界面风格,发现这个设计很好 波特率的组合框只给出了5个可选数值,然后第6个选项是Custom,即手动输入. 实际上DCB结构的BaudRat ...
- FPGA将加速今日新型态数据中心的主流应用
在这个强调智能与联网的时代,可编程逻辑栅阵列 (FPGA)已经成为一个重要且不可或缺的元件.以全球500亿个联网设备,一年所产生的数据量将不计其数.从数据中心.5G通讯.虚拟网络功能,到嵌入式系统,F ...
- 【Hibernate学习笔记-3】在Spring下整合Hibernate时, 关于sessionFactory的类型的说明
摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFac ...
- tcp端口检测
# coding=utf-8 import sys import socket import re def check_server(address, port): s = socket.socket ...
- class<T>和 class<?>类型 有什么区别
平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思,今天整理下: ? 表示不确定的java类型. T 表示java类型. K V 分别代 ...
- eterm和easyfare的官网地址
里面有eterm下载和eterm文档资料 运价软件easyfare和easyfare的文档. https://www.eterm.com.cn/caci/eterm/index-cn.jsp http ...
- Javascript中Closure及其相关概念
我相信学过Javascript这门语言的程序员应该都对Closure这个概念有所了解,然而网上以及各种Javascript书籍里面对Closure这个概念的定义有各种说法.我本人觉得很多地方对Clos ...
- 第4章 文件和目录(5)_贯穿案例2:mini shell(1)
6. 贯穿案例2:mini shell(1) [阶段性任务]实现cd.pwd和quit命令 //job.h #ifndef __JOB_H__ #define __JOB_H__ //接收命令行参数 ...
- ASP.NET基于Redis的Provider库
因为session基于本地cache,以前我们自己写分布式缓存,或者数据库存储,或者cookie加密存储,来保存用户状态信息,但较少的直接通过创建一个继承 SessionStateStoreProvi ...