Boost中实现线程安全
博客转载自: http://www.cnblogs.com/lvdongjie/p/4447142.html
1 boost原子变量和线程
#include <boost/thread.hpp>
using namespace boost;
using namespace std; mutex io_mu; // 定认全局互斥变量 /*
* 模板类: 线程安全的计数器,不可拷贝
*/
template<typename T>
class basic_atom : noncopyable
{
private:
T n;
mutex mu;
public:
basic_atom(T x = T()) :n(x) {}
T operator++() {
mutex::scoped_lock lock(mu); //用scoped_lock锁住成员互斥信号变量
return ++n;
}
operator T() { return n; }
}; typedef basic_atom<int> atom_int; // 将模板类定义精简名atom_int int to_interrupt(atom_int& x, const string& str)
{
try
{
for (int i = ; i < ; ++i)
{
this_thread::sleep(posix_time::seconds()); // 此处应该是子线程sleep1秒
mutex::scoped_lock lock(io_mu); //io流非线程安全,必须锁住
cout << str << ": " << ++x << endl;
}
}
catch (thread_interrupted&)
{
cout << "thread interrupted" << endl;
return -;
} return ;
} int main()
{
atom_int x;
thread t(to_interrupt, boost::ref(x), "hello"); // t调用to_interrupt函数,并输出hello x
this_thread::sleep(posix_time::seconds()); //此处应该是主线程睡眠3秒
t.interrupt(); // 调用线程的中断操作
t.join(); // 因为线程已中断,所以线程立即返回 getchar();
return ;
}
t.join()作用
一句话:把当前线程合并到主线程
详细点:
程序的入口点是Main函数
主程序定义了一个线程,这个线程是执行一个延时输出“--”的函数
如果没有这句join,那么程序就会一边执行输出“--”一边执行主程序下面的代码
有了这个join 意思就是大家都在一条线上了,我执行完了才轮到主程序执行。
Boost中实现线程安全的更多相关文章
- 使用boost中的线程池
#include <boost/thread/thread.hpp>#include <boost/bind.hpp>#include <iostream> u ...
- Boost库实现线程池学习及线程实现的异步调用
A.Boost线程池实现 参考自: Boost库实现线程池实例 原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行:使用队列存储待 ...
- 一个boost底下的线程池
Boost的thread库中目前并没有提供线程池,我在sorceforge上找了一个用boost编写的线程池.该线程池和boost结合的比较好,并且提供了多种任务执行策略,使用也非常简单. 下载地址: ...
- boost::thread编程-线程中断(转)
原文转自 http://blog.csdn.net/anda0109/article/details/41943691 thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线 ...
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- rxjava源码中的线程知识
rxjava源码中的线程知识 rx的最精简的总结就是:异步 这里说一下以下的五个类 1.Future2.ConcurrentLinkedQueue3.volatile关键字4.AtomicRefere ...
- C#中的线程(一)入门
文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中文翻译作者把原文放在了& ...
- C#中的线程四(System.Threading.Thread)
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...
- C#中的线程三 (结合ProgressBar学习Control.BeginInvoke)
C#中的线程三(结合ProgressBar学习Control.BeginInvoke) 本篇继上篇转载的关于Control.BeginInvoke的论述之后,再结合一个实例来说明Cotrol.Begi ...
随机推荐
- eclipse配置lombok
原文:http://wsj356428476.iteye.com/blog/1655032 1.下载Lombok.jar https://projectlombok.org/ 2.运行Lombok.j ...
- 使用for循环添加点击事件时,获取i值的方法
比如页面上有一个ul,数个li,现在给li添加点击事件. var li = document.getElementsByTagName("li"); for(var i = 0; ...
- jdbc connection为什么放在webINF的lib里面
jdbc connection为什么放在webINF的lib里面
- 2018.8.11E-mail
1发送附件 Attached please find the XXX for your review and comment. Outlook的附件最好不超过10M,文件要用英语命名,视频音频要压缩 ...
- redhat5.8 alt+ctrl+f1 黑屏
/********************************************************************** * redhat5.8 alt+ctrl+f1 黑屏 * ...
- 已知一个数组a[N]来构造数组b[N]的有趣算法题
给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i].在构造过程要求满足:1.不使用除法:2.O(1)空间复杂度和O(n)时间复杂度:3.除 ...
- webpack 配置简单说几句 ?
前言 这几天在准备一个单页面应用, 准备试试webpack神器,在准备webpack下的知识点,顺便记录下一些使用的心得. webpack 的配置说明 在近来的前端开发中,业务逻辑复杂化,层次多样化, ...
- bzoj 3625(CF 438E)The Child and Binary Tree——多项式开方
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3625 http://codeforces.com/contest/438/problem/E ...
- ICanPay介绍
ICanPay介绍 ICanPay是一个支持多商户多种支付方式的跨平台网关处理类库,使用ICanPay可以简化订单的创建.查询.退款和接收网关返回的支付通知等操作. 目前支持的支付网关有:支付宝(Al ...
- Java基础--HashCode
如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...