c++线程安全的栈
来源:互联网 发布:yy笑声软件下载 编辑:程序博客网 时间:2024/05/29 09:03
整理自c++并发编程实战
/* * threadsafe_stack.cpp * * Created on: Nov 30, 2017 * Author: clh01s@163.com * 线程安全的栈 */#include <exception>#include <iostream>#include <mutex>#include <stack>#include <memory>#include <string>using namespace std;struct empty_stack: exception{ const char* what() const throw();};template<typename T>class threadsafe_stack{public: threadsafe_stack(){} threadsafe_stack(const threadsafe_stack& other) { lock_guard<mutex> lock(other.m); data = other.data; } //禁止使用= threadsafe_stack& operator=(const threadsafe_stack&) = delete; void push(T new_value) { //调用锁 lock_guard<mutex> lock(m); /* 调用data.push()可能会抛出异常 * 如果复制或者移动数据项抛出异常或 * 者不能分配足够的内存来扩展下层的 * 数据结构。 * 不管怎样,stack保证了它是安全的 * 因此这不是一个问题。 */ cout<<"push value = "<<new_value<<endl; data.push(move(new_value)); } shared_ptr<T> pop() { lock_guard<mutex> lock(m); /* 在函数pop()重载的第一种形式中 * 他的代码可能会抛出一个empty_stack * 异常,但是没有做任何修改,因此它时安全的 */ if(data.empty()) throw empty_stack(); /* 创建res可能会抛出异常 * 1.调用make_shared可能会抛出异常 * 因为它无法为新对象和需要引用计数的 * 内部数据分配内存。 * 2.复制构造函数或移动构造函数中返回 * 数据项被复制/移动到新分配的内存时也 * 可能会抛出异常。 * 这两种情况下c++运行库和标准库确保没 * 有内存泄露并且新对象被正确销毁。因为 * 你仍然没有修改下层的栈所以没有问题。 */ shared_ptr<T> const res( make_shared<T>(move(data.top()))); //调用data.pop()保证了不会抛出异常,因此pop()的重载是异常安全的 data.pop(); return res; } void pop(T& value) { lock_guard<mutex> lock(m); if(data.empty()) throw empty_stack(); /* 这次于第一次时类似的,只不过这次是拷贝赋值 * 或移动赋值操作符抛出异常,而不是构造新对象 * 和一个shared_ptr实例抛出异常 */ value = move(data.pop()); //这于上一个重载相同不会抛出异常 data.pop(); } bool empty() const { lock_guard<mutex> lock(m); return data.empty(); }private: stack<T> data; mutable mutex m;};int main(){ threadsafe_stack<string> a; a.push("aa"); a.push("bb"); return 0;}
程序输出:
clh@clh:~/testcode/并发$ g++ threadsafe_stack.cpp -std=c++11clh@clh:~/testcode/并发$ ./a.out push value = aapush value = bb
转载请注明源地址:http://blog.csdn.net/clh01s
阅读全文
0 0
- c# SingleTon的线程安全(存档)
- 线程安全C/C++
- 线程安全C/C++
- 栈是线程安全的
- c++线程安全的栈
- 【C/C++】什么是线程安全
- .NET(C#):线程安全集合的阻塞BlockingCollection的使用
- .NET(C#):线程安全集合的阻塞BlockingCollection的使用
- 【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解
- C runtime lib 线程安全
- C/C++ 线程安全队列
- [c++]如何编写线程安全的DLL(转帖)
- linux多线程编程(C):信号量实现的线程安全队列
- linux多线程编程(C):互斥量实现的线程安全队列
- J.U.C系列-线程安全的理论讲解
- c语言非线程安全函数引发的BUG一列
- 设计模式 - 线程安全的单例模式(C#)
- object-c 单例模式的线程安全
- mac之tomcat安装启动配置
- 《算法艺术与信息学竞赛》之 递归与分治法 例四 丢失的数
- 代码重构/坏味道详解
- 【Android studio】R文件错误的解决办法
- 棋盘游戏 HDU
- c++线程安全的栈
- es
- react-native总结之项目开发环境创建
- Android是如何在不同屏幕上适配图片的 -- 或控件大小
- debian下安装LNMP环境(二)
- 公众号从菜鸟到高手的进化:微信公众平台自动回复功能
- 求3个数最大值和最小值的差
- 【Java】【JVM】JVM参数
- CT图像增强