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

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. 05-python的输入与输出

    python输入(input)与输出(print) 一.输入(input) 在python3中,input会将接收到的用户输入自动存储为字符串类型 username = input('输入用户名:') ...

  2. Vue 权限控制 使用自定义指令 代替v-if

    参考了vue-element-admin 指令库的permission 使用Demo(demo.vue) <template> <p>admin组:<span v-per ...

  3. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 49; columnNumber: 17; 元素类型为 "configuration" 的内容必须匹配 "

    问题现象: Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: o ...

  4. conda创建和启动python虚拟环境

    conda与python虚拟环境 创建环境 conda create -n ENV_NAME python=3.9 激活环境 conda activate ENV_NAME 给虚拟环境安装包: con ...

  5. 2022-05-16内部群每日三题-清辉PMP

    1.项目可交付成果已移交给客户,项目经理现在必须收集项目参与者的反馈意见.项目经理应该查阅哪份文件来确定哪些人应该被包含进请求反馈意见的名单中? A.相关方登记册 B.沟通管理计划 C.经验教训 D. ...

  6. 对NAN的认识

    NaN是个特殊的数值,它与任何值都不相等,包括它自己,NaN==NaN和NaN===NaN都是false,如果想测试某个数字是否为NaN,可以使用内置的函数isNaN(),如果是NaN则返回true, ...

  7. Symbol类型

    Symbol 是ES6引入的一种新的原始数据类型,由于Symbol是一个原始类型的值,不是对象,不能添加属性.基本上 是一种类似于字符串的数据类型 概述 Symbol 可以接受一个字符串作为参数,主要 ...

  8. Java复习篇3---基础概念

    关键字 关键字:被Java赋予了特定含义的英文单词 关键字的字母全是小写 常用的代码编辑器,针对关键字会有特殊的颜色标记,非常直观 例如: class: 用于(创建\定义)一个类,后面紧跟类名. 类是 ...

  9. Leaflet加载GeoServer发布的WMTS地图服务

    leaflet本身并不支持WMTS服务,需要借助leaflet-tilelayer-wmts插件实现,但是插件是为通用WMTS服务实现的.在使用的过程中出现了无法调用的问题,这里进行了稍微修改. 加载 ...

  10. 关于oracle中scott用户恢复到初始状态的步骤,和一些问题解决方法。

    一般恢复步骤: sqlplus 连接到sys用户sqlplus / as sysdba运行脚本进行初始恢复start ?/rdbms/admin/utlsampl.sql;恢复后,用户为锁定状态,需要 ...