当前位置: 首页 > news >正文

【C++ 面试 - 新特性】每日 3 题(九)

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

25. 线程间同步通信 - 生产者消费者模型

两者生产一个就消费一个,结束后互相通知对方。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue> //STL所有容器都不是线程安全using namespace std;std::mutex mtx; //定义互斥锁, 线程间互斥
std::condition_variable cv; //定义条件变量, 线程间通信class Queue
{
public:void put(int val){//lock_guard<std::mutex>guard(mtx);//error scoped_ptr 左值拷贝构造和赋值都delete了unique_lock<std::mutex> lck(mtx); //防止这把锁被释放了while (!que.empty()){cv.wait(lck); //线程进入等待, 并把mtx锁释放}que.push(val);cv.notify_all(); //其他线程得到该通知,从等待变为阻塞,获取锁后继续执行cout << "生产者 生产:" << val << " 号物品" << endl;}int get(){//lock_guard<std::mutex>guard(mtx);unique_lock<std::mutex>lck(mtx);while (que.empty()){cv.wait(lck);}int val = que.front();que.pop();cv.notify_all();cout << "消费者 消费:" << val << "号物品" << endl;return val;}
private:queue<int> que;
};void producer(Queue* que)
{for (int i = 0; i < 10; i++){que->put(i);std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}void consumer(Queue* que)
{for (int i = 0; i < 10; i++){que->get();std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}int main()
{Queue que;std::thread t1(producer, &que);std::thread t2(consumer, &que);t1.join();t2.join();return 0;
}

26. 再谈 lock_guard 和 unique_lock

lock_guard 和 unique_lock

  • unique_lock:不仅可以使用在简单的临界区代码段的互斥操作中,还能用在函数调用过程中。
  • lock_guard:不可能用在函数参数传递或者返回过程中,只能用在简单的临界区代码段的互斥操作中。
    condition_variable wait 和 notify_all 方法
  • notify_all:通知在 cv 上等待的线程,条件成立了,起来干活。其它 cv 上等待的线程收到通知,从等待态到阻塞态。

27. 基于 CAS 操作的 atomic 原子类型

互斥锁比较重,效率比较低,临界区代码做的事情稍稍复杂时再用。
用 CAS 来保证 ++ – 操作的原子特性就足够了(无锁操作)。

无锁队列:

#include <iostream>
#include <mutex>
#include <condition_variable>
#include <atomic> //包含了很多原子类型
#include <list>using namespace std;//volatile 防止多线程对共享变量进行缓存
volatile std::atomic_bool isReady = true; 
volatile std::atomic_int ccount = 0;
//int ccount = 0;void task()
{while (!isReady){std::this_thread::yield(); //线程出让当前的cpu时间片,等待下一次调度}for (int i = 0; i < 1000; i++)ccount++;
}int main()
{list<std::thread> tlist;for (int i = 0; i < 10; i++) {tlist.push_back(std::thread(task));}for (auto& t : tlist){t.join();}cout << ccount << endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Web3 项目安全手册
  • BEV学习---LSS-2
  • oceanbase(ob)基于备份集搭建备租户方式
  • Linux中常见的Docker问题及解决方法
  • 【基础知识复习 - 随机练习题】
  • Flask 第三课 -- 第一个应用
  • C++设计模式——Memento备忘录模式
  • 谷粒商城-P125【gulimall-search】:更改 elasticsearch 版本不生效
  • 【电子通识】半导体工艺——刻蚀工艺
  • C语言指针详解与应用
  • HTML/CSS/JS学习笔记 Day4(HTML--C3 表格)
  • AI预测地球未来,温室效应失控?地球变金星?
  • Dubbo 与 Zookeeper 在项目中的应用:原理与实现详解
  • unocss 一直热更新打印[vite] hot updated: /__uno.css
  • C语言 ——— 学习并使用 #if defined #ifdef #ifndef 条件编译指令
  • Git的一些常用操作
  • Java 多线程编程之:notify 和 wait 用法
  • Java面向对象及其三大特征
  • Mysql5.6主从复制
  • PHP 的 SAPI 是个什么东西
  • Python_网络编程
  • python学习笔记-类对象的信息
  • Redis的resp协议
  • 关于springcloud Gateway中的限流
  • 解决iview多表头动态更改列元素发生的错误
  • 新版博客前端前瞻
  • 用mpvue开发微信小程序
  • 06-01 点餐小程序前台界面搭建
  • mysql面试题分组并合并列
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # linux 中使用 visudo 命令,怎么保存退出?
  • (1)常见O(n^2)排序算法解析
  • (12)目标检测_SSD基于pytorch搭建代码
  • (a /b)*c的值
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (动态规划)5. 最长回文子串 java解决
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)事件系统
  • (转)setTimeout 和 setInterval 的区别
  • (转)Unity3DUnity3D在android下调试
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core中的去虚
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET Standard 的管理策略
  • .NET 分布式技术比较
  • .NET 回调、接口回调、 委托
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .Net中的设计模式——Factory Method模式
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复