C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种:
- 互斥锁
- 条件变量
- 信号量
这篇博客只介绍互斥量和条件变量的使用。
互斥锁和条件变量
通常情况下,互斥锁和条件变量是配合使用的,互斥锁用于短期锁定,主要保证线程对临界区的进入;条件变量用于线程长期等待,在wait的时候会释放锁。操作的API如下所示(介绍最常用的):
std::mutex: 独占的互斥量,不能递归使用
std::condition_variable:条件变量,配合std::unique<std::mutex>进行wait操作。
std::condition_variable_any和任意带有lock,unlock的mutex配合使用,但是效率比std::condition_variable差。
举个栗子:
10个人排队使用打印机,任一时刻只有一个人能使用。用一个变量i的0和1两种状态分别表示打印机能不能使用。这个程序这样写,详细解释见注释:
#include<iostream>
#include<condition_variable>
#include<vector>
#include<thread>
std::vector<std::thread> tv;         //保存线程的情况
std::condition_variable_any m_t;     //条件变量
std::mutex lock;                     //互斥锁
int i = 1;                           //打印机资源 初始为1 表示可用
void subi() {
    std::lock_guard<std::mutex> locker(lock);  //使用之前先加锁
    while(i == 0){             //如果不可用
        m_t.wait(lock);        //将当前线程阻塞,注意:此时会释放锁
    }
    i--;                       //使用打印机过程
}
void addi() {
    std::lock_guard<std::mutex> locker(lock); //同理,放弃使用的时候先加锁
    i++;                       //是资源变为可用
    m_t.notify_all();          //通知其余阻塞的使用者可以使用了
}
void func(int j) {
    subi();
    std::cout << "I am thread "<< j << " , i = " << i << std::endl;
    addi();
}
int main(int argc,char *argv[])
{
    for(int j = 0; j < 10 ; ++j) {
        std::thread t(func,j);
        tv.push_back(std::move(t));
    }
    for(auto &thread : tv) {
        thread.join();
    }
    return 0;
}
测试情况应该是:每个进程输出的i都为0,表示每个进程都在合理的使用打印机,没有出现同时使用的情况,即i < 0的情况。
$ g++ condition.cpp -pthread //注意链接pthread
嗯,可见我们的使用姿势是正确的~
C++11 多线程同步 互斥锁 条件变量的更多相关文章
- 【C】——信号量 互斥锁 条件变量的区别
		信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某 ... 
- c++11多线程记录6:条件变量(condition variables)
		https://www.youtube.com/watch?v=13dFggo4t_I视频地址 实例1 考虑这样一个场景:存在一个全局队列deque,线程A向deque中推入数据(写),线程B从deq ... 
- Python多线程同步互斥锁
		接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案. 出现这个情况的原因是在python解释器中GIL全局解释器锁. GIL:全局解释器锁,每个线程在执行的过程都 ... 
- 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
		Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ... 
- Linux多线程编程详细解析----条件变量 pthread_cond_t
		Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ... 
- 总结windows多线程同步互斥
		windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ... 
- windows多线程同步互斥--总结
		我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ... 
- (转)Linux C 多线程编程----互斥锁与条件变量
		转:http://blog.csdn.net/xing_hao/article/details/6626223 一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1. 初始化: 在 ... 
- Java多线程---同步与锁
		一,线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 二.同步和锁定 1.锁的原理 Java中每个对象都有一个内置锁. 当程序运行到非静态的synchronized同步方法上时,自动 ... 
随机推荐
- php 设计模式 --适配器
			1,目标:实现一个不同的类不同方法,符合一定的规范: 规范类 <?php interface Iplay{ function Attack(); function Defence(); } cl ... 
- First  Linux Centos 7.2 rpm 安装MySQL 5.7
			服务器需要换python环境,手贱重装了,今天凑巧需要测试数据库,花了一个小时搞了一下MySQL安装. 1.删除原有Mariadb 说明:目前centos默认的MySQL是Mariadb,由于习惯了M ... 
- 测试工程需要明白的Monkey测试
			App稳定性测试 稳定性测试就是指软件长时间的持续运行,系统版本是否稳定,是否能否持续的为用户提供服务. 指标: 异常的次数 异常的频率 App的稳定性测试如何实施? 首选Monkey Monkey是 ... 
- 三千字介绍Redis主从+哨兵+集群
			一.Redis持久化策略 1.RDB 每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去. 优点: 因为他是每隔一段时间的全量备份,代表了每个时间段的数据.所以适合做冷备份. R ... 
- css超出隐藏显示省略号怎么设置?
			当我们在进行网页前端开发的时候,一般获取文章标题,然后一行一行的显示.但是当标题过长的时候,就会造成换行显示.还有显示部分文本信息时,如果全部显示就过于繁琐,会带来不会的网页体验感.虽然我们可以使用o ... 
- 洛谷3233 HNOI2014(虚树+dp)
			膜拜一发\(mts\_246,forever\_shi\) 这两位爷是真的无敌! 首先来看这个题,一看题目的数据范围和"关键点"字眼,我们就能得知这是一道虚树题 那就先一如既往的建 ... 
- CVPR2021提出的一些新数据集汇总
			 前言 在<论文创新的常见思路总结>(点击标题阅读)一文中,提到过一些新的数据集或者新方向比较容易出论文.因此纠结于选择课题方向的读者可以考虑以下几个新方向.文末附相关论文获取方式. ... 
- css实现水平-垂直居中的方法
			* 定宽居中: 1.absolute+负margin 2.absolute+margin:auto 3.absolute--calc 4.min-height:100vh + flex + margi ... 
- 前端HTML元素的类型名称
			<div id="content" class="para" style="width:800px;"> <p>He ... 
- MarkDown之Typora使用
			Typora:所见即所得 常用快捷键 加粗:ctrl + B 标题:ctrl + 16,对于与16级标题 插入公式:ctrl + Shift + m 插入代码:ctrl + Shift + K 插入图 ... 
