c++11多线程编程---线程安全队列
2016-11-04 00:01
295 查看
线程安全队列
c11正式引入了自己的线程类,让c++的多线程编程变的更加优雅。由于不同的编译器对新特性的支持有所差异,这里的代码都是在gcc 4.8版本下编译运行。
涉及到的C++11的知识如下:thread 线程库
同步和互斥有关量:mutex 和 condition_variable
简单的资源管理类:lock_guard,unique_lock,shared_ptr.
lambda表达式
底层容器为queue,这里将取元素front() 和弹出pop()操作合并为一个接口,为了防止以下事件:在取元素和弹出元素之间这段时间又有其他线程进行front()或者pop(),出现 错误。
#include <iostream> #include <thread> #include <condition_variable> #include <mutex> #include <memory> #include <algorithm> #include <vector> #include <string> #include <queue> using namespace std; template<typename T> class safe_queue { public: mutex m_mut; condition_variable m_cond; queue<T> m_queue; public: safe_queue(){} safe_queue(const safe_queue& rhs) { lock_guard<mutex> lk(rhs.m_mut); m_queue = rhs; } void push(T data) { lock_guard<mutex> lk(m_mut); // 使用效率高的lock_guard m_queue.push(move(data)); // 移动构造函数,防止对象不能拷贝 m_cond.notify_one(); // 通知唤醒阻塞的一个线程 } void wait_and_pop(T &res) // 直到队列不为空 { unique_lock<mutex> lk(m_mut); m_cond.wait(lk,[this]{return !m_queue.empty();}); res = move(m_queue.front()); m_queue.pop(); } bool try_pop(T &res) //立即返回 { lock_guard<mutex> lk(m_mut); if(m_queue.empty()) return false; res = move(m_queue.front()); return true; } /* 下面这种是由返回值返回元素。 */ shared_ptr<T> wait_and_pop() { unique_lock<mutex> lk(m_mut); m_cond.wait(lk,[this]{return !m_queue.empty();}); shared_ptr<T> res(make_shared<T>(move(m_queue.front()))); m_queue.pop(); return res; } shared_ptr<T> try_pop() { lock_guard<mutex> lk(m_mut); if(m_queue.empty()) return NULL; shared_ptr<T> res(make_shared<T>(move(m_queue.front()))); m_queue.pop(); return res; } };
测试:
void func(safe_queue<string> &que) { while(1) // 不断的处理数据 { string a; que.wait_and_pop(a); // 没有元素则阻塞 cout<<"thread_id :"<<this_thread::get_id(); cout<<" input is: "<<a<<endl; } } int main() { safe_queue<string> que; vector<thread> threads; for(int i = 0;i<5;++i) // 这里创建5个测试线程 { threads.push_back(thread(func,ref(que))); } string a; while(cin>>a) // 数据准备线程,在不断的获取数据。 { que.push(a); } for_each(threads.begin(),threads.end(),mem_fn(&thread::join)); //调用所有线程的join函数,等待任务完成 return 0; }
测试结果如下:
相关文章推荐
- 基于Linux的消息队列及多线程编程实现的聊天室(一)
- Linux多线程系列-2-条件变量的使用(线程安全队列的实现)
- 多线程下面日志输出-线程安全-消息队列循环输出
- c++11线程安全的队列的类的定义
- 编程思想之多线程与多进程(2)-线程优先级与线程安全
- 基于Linux的消息队列及多线程编程实现的聊天室(一)
- iOS-多线程编程学习之GCD——串行队列和并发队列(五)
- 编程思想之多线程与多进程(2)——线程优先级与线程安全
- 【并发编程实战笔记】--使用锁和条件变量的线程安全队列
- C++11 并发编程基础(一):并发、并行与C++多线程
- Linux多线程系列-2-条件变量的使用(线程安全队列的实现)
- C++11多线程编程之互斥量
- 多线程编程实例:不带缓冲的多线程文件复制(使用队列,互斥,条件变量)
- Java的多线程编程模型2--怎样才线程安全
- C++11 多线程编程《C++ Concurrency in Action》读书笔记(3)-Sharing data between Threads
- iphone开发- 多线程编程- 操作队列
- [多线程学习笔记] 一个线程安全的队列
- C++11 多线程编程《C++ Concurrency in Action》读书笔记(1)-Hello World of Concurrency in C++
- PHP 高级编程之多线程-消息队列
- 编程思想之多线程与多进程(2)——线程优先级与线程安全