c++ thread, 模板类,锁的调用实例
#include<thread>
#include<condition_variable>
#include<mutex>
#include<queue>
#include<stdio.h> template <class T>
class ThreadSafeQueue{
public:
void Insert(T value);
void Popup(T &value);
bool Empty() const; private:
mutable std::mutex mut_;
std::queue<T> que_;
std::condition_variable cond_;
}; template <class T>
void ThreadSafeQueue<T>::Insert(T value){
std::lock_guard<std::mutex> lk(mut_);
que_.push(value);
cond_.notify_one();
} template <class T>
void ThreadSafeQueue<T>::Popup(T &value){
std::unique_lock<std::mutex> lk(mut_);
cond_.wait(lk, [this]{return !que_.empty();}); // 如果lamda表达式 [this]{return !que_.empty(); 返回 true, 也就是队列非空,则上锁,继续执行下面的语句;
value = que_.front(); // 如果lamda表达式返回False, 也就是队列为空,则解开锁,该线程进入wait,阻塞模式,等待被唤醒
que_.pop();
} template <class T>
bool ThreadSafeQueue<T>::Empty() const{
std::lock_guard<std::mutex> lk(mut_);
return que_.empty();
} int main(){
ThreadSafeQueue<int> q;
int value=1;
std::thread t2(&ThreadSafeQueue<int>::Popup, &q, std::ref(value)); // 传引用参数的时候需要使用引用包装器std::ref
std::thread t1(&ThreadSafeQueue<int>::Insert, &q, 10);
printf("%d\n", value);
while(!q.Empty());
t1.join();
t2.join();
printf("%d\n", value);
return 0;
}
c++ thread, 模板类,锁的调用实例的更多相关文章
- synchronized类锁,对象锁,方法锁
synchronized从语法的维度一共有3个用法: 静态方法加上关键字 实例方法(也就是普通方法)加上关键字 方法中使用同步代码块 前两种方式最为偷懒,第三种方式比前两种性能要好. synchron ...
- 并发编程大师系列之:Synchronized的类锁和对象锁
说到并发编程,感觉跟大多数人一样,谈之色变,说它简单把,其实很有内容,说难吧,用起来也挺容易,最近我硬着头皮,决心要把并发编程好好的搞一遍.以前,面试的时候,面试官问,并发编程会吗?嗯,接触过,就加一 ...
- C++ 模板类友元之输出流操作符重载
几个关键点: 需要前置声明!--奇怪的是别人告诉我也可以不需要,但我这里不行! 友元函数的函数名后面的<>,必须要有. #include <stdio.h> #include ...
- 个人对java中对象锁与类锁的一些理解与实例
一 什么是对象锁 对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个 ...
- 【Thread】java线程之对象锁、类锁、线程安全
说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...
- java synchronized类锁,对象锁详解(转载)
觉得还不错 留个记录,转载自http://zhh9106.iteye.com/blog/2151791 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看 ...
- Java锁Synchronized,对象锁和类锁举例
Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须 ...
- (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别
场景:面试的时候经常用得到! 1 综述 Synchronized和Static Synchronized区别 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全 ...
- Java锁Synchronized对象锁和类锁区别
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...
- Java对象锁和类锁全面解析(多线程synchronized关键字)
最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...
随机推荐
- ptyhon基础课程_2
10 输入 # 例一 user_name = input ("请输入姓名:") message = user_name + "shaobing" print ( ...
- 直播软件搭建,姓名,身份证input验证过滤
直播软件搭建,姓名,身份证input验证过滤 姓名验证:需求,可输入英文.汉字 for(let i=0;i<e.length;i++){ if(/^[a-zA-Z\u4e00-\u9fa5]+ ...
- skype网络异常无法登录
在有些win7电脑上安装最新版skype软件后,打开skype软件后显示无法访问网络 检查网络及防火墙,确定无异常 最后排查原因定位到操作系统的根证书 发现系统缺少部分DigiCert的根证书 从其他 ...
- ROS创建工作空间 Create your workspace
https://blog.csdn.net/baidu_38869387/article/details/119840120 http://wiki.ros.org/catkin/Tutorials/ ...
- [MySQL高级](一) EXPLAIN用法和结果分析
转载自: https://blog.csdn.net/why15732625998/article/details/80388236
- vscode 右键运行php文件到浏览器
1.安装PHP Server插件 2.在需要打开的文件中右键选择PHP Server:Server project 3.浏览器页面显示
- 【RUNOOB】C语言学习之指针
资料来源: (1) runoob; (2) C语言程序设计; 注1:Runoob中对于指针的讲述比较清晰简单,摘录出来(后续补充指针与结构体,指针与函数参数); 1.指针与变量的内存位置 (1) 每个 ...
- jmeter中监听器及测试结果分析
- vue页面点击按钮增加和删除标签
1.在data()里定义一个空数组: conditions:[], 2.给数组一个容器,并且遍历数组 <div v-for="item in conditions">& ...
- CAD轴测图怎么画?快来试试浩辰CAD超级轴测命令!
很多新手设计师小伙伴,不知道CAD轴测图怎么画?其实很简单,浩辰CAD中的超级轴测功能,可以方便地将CAD平面图转化为轴侧图,是绘制管线系统图的好帮手.今天就和小编一起来看看在浩辰CAD软件中通过调用 ...