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同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...
随机推荐
- python 给视频加入音频
1.先去查查 ffmpeg 这个东西 贼强 # 附上大佬博客 https://blog.csdn.net/qq_39752726/article/details/ 104263381?utm ...
- 08.JSP技术
一.什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据.JSP文件的扩展名是.jsp. JSP = htm ...
- Linux-samba共享
CentOS8 中 Samba环境搭建(满足Linux和Windows系统之间文件共享传输) Samba服务器通信协议(Server Messages Block)就是是为了解决局域网内的文件或打印机 ...
- (0319) SV 中的 iff 事件控制
https://blog.csdn.net/yinyeyy/article/details/111086864
- 可收集ALC问题[A non-collectible assembly may not reference a collectible assembly.]
ITask程序集在共享类库中定义,初衷是任务调度程序,创建新的可卸载ALC以供每一个任务运行,此时会出现两个问题: 任务调度程序加载了任务程序后,任务程序中的ITask类型和任务调度程序中的ITask ...
- 关于htpasswd
什么是 htpasswd htpasswd是一个apache的内置工具,其生成的文件称之为htpasswd文件.htpasswd文件本身一个密码本,或者类似于数据库一样,用来存储一些密码(凭证)信息. ...
- 读取数组树下的某值,并返回其父级下的任何值 vue
1 // 遍历树 获取对应 id的项中的值 2 queryTree(tree, value) { 3 let stark = []; 4 stark = stark.concat(tree); 5 w ...
- 洛谷 P5721 【入门3】循环结构
P5723 [深基4.例13]质数口袋 1.题目描述 小 A 有一个质数口袋,里面可以装各个质数.他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋. 口袋的负载量就是口袋 ...
- Vue源码主体分析
vue的响应式和react的函数式编程思想是很不同的. vue最基本的原理是对getter和setter的代理模式.以及观察者模式. 当数据发生变化时,通知观察者. 而watcher是通过触发数据的g ...
- 记录一次vue的报错
1.主要代码 <div class="hello-ezuikit-js" v-for="(item,index) in list"> <div ...