创建项目再进行测试比较麻烦,可以使用这个在线编译器进行验证,快速方便

C++11在线编译器

mutex是互斥锁,互斥量

condition_variable是条件变量

std::mutex m;
void fun(){
std::unique_lock<std::mutex> lck(m);//定义时会自动上锁
}
//离开函数fun作用域后,会自动析构并释放锁,当然也可以手动unlock std::unique_lock<std::mutex> lck2(m, std::defer_lock);// 通过defer_lock来手动上锁
lck2.lock()

下面是一段condition_variable的代码,作一点我的注释

来源:https://cplusplus.com/reference/condition_variable/condition_variable/

注意cv.wait(lck)处,在线程被阻塞和唤醒时,分别会释放锁和重新获取锁,和pthread_cond_wait一致

// condition_variable example
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#define threadnum 14 //自行修改观察结果,线程释放锁必然在go释放锁之后出现,有些线程也会在go释放锁之后才上锁 std::mutex mtx;
std::condition_variable cv;
bool ready = false; void print_id (int id) {
std::unique_lock<std::mutex> lck(mtx);//对mtx自动上锁
std::cout<< "thread " << id<<" 上锁"<<std::endl;//如果对下面阻塞释放锁和获取锁有疑问的,可以将此行注释取消进行分析
while (!ready) cv.wait(lck);//等待全局变量ready信号,线程阻塞在此,放弃cpu,在队列里等待cv的信号来唤醒,自动调用lck.unlock()释放锁
//当被唤醒时,会重新获取锁,自动调用lck.lock()
// ...
std::cout << "thread " << id <<" 释放锁"<<std::endl;
} void go() {
std::unique_lock<std::mutex> lck(mtx);//上锁
ready = true;//全局变量ready置为true
cv.notify_all();//唤醒所有等待线程
//离开该函数作用域,析构lck,并unlock该锁
std::cout<<"go 释放锁"<<std::endl;
} int main ()
{
std::thread threads[threadnum];
for (int i=0; i<threadnum; ++i)
threads[i] = std::thread(print_id,i);//创建时就开始运行,但阻塞在cv处,等待信号 std::cout << "threads ready to race...\n";
go();// go! for (auto& th : threads) th.join(); return 0;
}

C++11 mutex unique_lock condition_variable 互斥锁 条件变量的更多相关文章

  1. C++11 多线程同步 互斥锁 条件变量

    在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...

  2. 【C】——信号量 互斥锁 条件变量的区别

    信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某 ...

  3. APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量

    线程同步     同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性.     假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...

  4. [转]Posix-- 互斥锁 条件变量 信号量

    这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第三篇将向您讲述线程同步. 互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量 ...

  5. Linux的线程同步对象:互斥量Mutex,读写锁,条件变量

        进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...

  6. pthread mutex 进程间互斥锁实例

    共享标志 定义 名称 描述 0 PTHREAD_PROCESS_PRIVATE 进程内互斥锁 仅可当前进程内共享 1 PTHREAD_PROCESS_SHARED 进程间互斥锁 多个进程间共享 第一个 ...

  7. [openmp]使用嵌套互斥锁锁定变量

    本文出自:http://www.cnblogs.com/svitter 转载请注明出处. 如果有一个线程必须要同时加锁两次,只能用嵌套型锁函数 函数名称 描述 void omp_init_nest_l ...

  8. 嵌入式开发之hi3519---进程线程间的同步和互斥,条件变量、信号了、互斥锁等

    sem_post 最安全 sem  有序,会卡顿 阻塞 mutex  无序,不能同步 http://blog.chinaunix.net/uid-20671208-id-4935154.html ht ...

  9. C++ 并发编程之互斥锁和条件变量的性能比较

    介绍 本文以最简单生产者消费者模型,通过运行程序,观察该进程的cpu使用率,来对比使用互斥锁 和 互斥锁+条件变量的性能比较. 本例子的生产者消费者模型,1个生产者,5个消费者. 生产者线程往队列里放 ...

  10. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

    上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html   现在有这篇文章: http://blog.cs ...

随机推荐

  1. FPGA MIG调试bug(二)

    目标器件:复旦微FPGA:JFM7K325T8FCBGA676(对标Xilinx Kintex-7系的XC7K325T) 工程背景:送入FPGA的外部时钟为差分时钟,时钟送入FPGA后,经过PLL输出 ...

  2. 微信小程序tabBar图标显示失败问题

    练习tabBar时发现链入的图片在没有任何语句语法错误以及报错的情况下显示失败 试了很多办法 最后请教了一下学长才知道需要重启小程序开发工具并清缓存 问题解决

  3. shell中算术运算加减

    在shell脚本中,所有的变量默认都是字符串存储,操作也是按照字符串进行处理的,但我们不可避免的需要对各中数值进行算术运算,如算术的相加减,那么这时怎么处理呢?在shell脚本中,我们要实现对数值的算 ...

  4. 代码随想录训练营day 4|链表基础理论,移除链表元素,设计链表,反转链表

    链表理论基础 链表是一种由指针串联在一起的线性结构,每一个节点都由一个数据域和一个指针域组成. 链表的类型有:单链表.双链表.循环链表. 链表的存储方式:在内存中不连续分布. 链表的定义很多人因为不重 ...

  5. grafana+prometheus+tomcat 监控tomcat

    一.前提 1.tomcat作为java项目首选的部署容器.但是,在做测试,或者是在运维管理生产服务器的时候,想要监控tomcat的实时运行情况,却不是那么容易的 2.grafana(已安装和prome ...

  6. 【Frida】Java反射调用

    通过反射调用,获取类名 参数Object obj 类名 String str 方法名 static Object a(Object obj, String str) { try { return ob ...

  7. ES使用

    shards 分片数 ES存储数据可以存储在多个分片 下载ES curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elas ...

  8. python 通过win32com操作vcf到outlook中,同时解决乱码问题

    之前用的黑莓手机,故障后换了iphone,后来还是想用上黑莓Q10.于是有了该文章. 问题: 如何将iphone上的通讯录导入黑莓? 网上回答1:通过icloud将iphone中的通讯录导入黑莓手机. ...

  9. keeplive 双击热备方案 (对haproxy负载均衡 )双击热备方案

    1.安装 keepalived ,必选安装在haproxy 容器之内 1.进入容器:docker exec  -it   h1 bash 后执行下面步骤 1.更新apt-get apt-get upd ...

  10. Hadoop批处理方案 和 MPP架构方案 作为数据仓库的区别

    1,原理对比 MPP方案中的数据通常在节点之间拆分(分片),每个节点仅处理其本地数据.而且,每家都有专门为 MPP 解决方案开发的复杂而成熟的 SQL 优化器.它们都可以在内置语言和围绕这些解决方案的 ...