(十)boost库之多线程
(十)boost库之多线程
1、创建线程
使用boost库可以方便的创建一个线程,并提供最多支持9个参数的线程函数,相对于void*来说,方便了很多,创建线程主要提供了一下3种方式:
线程库头文件:#include <boost/thread.hpp>
a、使用全局函数作为线程执行体
void Func(int nCount){for (int i = 0; i < nCount; i++){cout << __FUNCTION__ << i << endl;}}int _tmain(int argc, _TCHAR* argv[]){boost::thread th(Func, 100);//等待线程结束th.join();}b、使用成员函数作为线程执行体
class A{public:void Func(int nCount){for (int i = 0; i < nCount; i++){cout << __FUNCTION__ << i << endl;}}};//线程参数都采用值传递,因此即使如下传入一个临时变量作为参数,线程照样可以正确运行//如果需要传递引用,可通过ref库来实现boost::thread *pth;void TestThread(){A a;//线程绑定一个局部变量pth = new boost::thread( &A::Func, &a, 100);}c、仿函数作为线程执行体
class B{public:B(int n):nMem(n){}void operator()(){for (int i = 0; i < nMem; i++){cout << __FUNCTION__ << i << endl;}}int nMem;};//线程thread对象销毁时,会与线程执行体分离,线程执行体不受影响void TestThread2(){//创建临时线程对象boost::thread(B(100));}结合以上方法,我们可以轻而易举的就创建一个线程,结合boost.bind库和lambda表达式,将会更方便。如:
boost::thread th3([](int nCount){for (int i = 0; i < nCount; i++){cout << __FUNCTION__ << i << endl;}}, 10);
2、中断线程
线程不是在任意时刻都可以被中断,因此要实现中断,需要我们自己决定什么时候可以被中断,boost库定义了以下函数是可以被中断的:
- boost::thread::join()
- boost::thread::timed_join()
- boost::boost::thread::try_join_for(),
- boost::boost::thread::try_join_until(),
- boost::condition_variable::wait()
- boost::condition_variable::timed_wait()
- boost::condition_variable::wait_for()
- boost::condition_variable::wait_until()
- boost::condition_variable_any::wait()
- boost::condition_variable_any::timed_wait()
- boost::condition_variable_any::wait_for()
- boost::condition_variable_any::wait_until()
- boost::thread::sleep()
- boost::this_thread::sleep_for()
- boost::this_thread::sleep_until()
- boost::this_thread::interruption_point()
成员函数interrupt,运行正在执行的线程中断,被中断的线程会抛出异常类boost::thread_interrupted,程序应该自行处理该异常,以确保线程正确结束。
void interrupt_thread(int nCount)
{
try
{
for (int i = 0; i < nCount; i++)
{
//sleep函数允许中断
boost::this_thread::sleep(boost::posix_time::seconds(1));
cout << __FUNCTION__ << i << endl;
}
}
catch(boost::thread_interrupted&)
{
cout << "thread interrupt" << endl;
}
}
boost::thread th2(interrupt_thread, 100);
boost::this_thread::sleep(boost::posix_time::seconds(4));
th2.interrupt();
在以上中断函数中,除了最后一个,其它都是等待函数,如果想在非等待情况下,运行线程被中断,就可以使用最后一个函数。
比如我们可以将上面的boost::this_thread::sleep(boost::posix_time::seconds(1));替换成 boost::this_thread::interruption_point();
3、线程组
有时我们需要管理一组线程对象,进行统一的等待处理,使用boost::thread_group可以轻松的处理。
#include <boost/bind.hpp>
void ThreadGroup()
{
boost::thread_group grp;
grp.create_thread( boost::bind(Func, 10));
A a;
grp.add_thread(new boost::thread(&A::Func, &a, 100));
grp.add_thread(new boost::thread(B(100)));
grp.join_all();
}
(十)boost库之多线程的更多相关文章
- (十二)boost库之多线程高级特性
(十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...
- (十一)boost库之多线程间通信
(十一)boost库之多线程间通信 1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一 ...
- boost库:多线程
1.线程管理 最重要的一个类是boost::thread,是在boost/thread.hpp里定义的,用来创建一个新线程. #include <boost/thread.hpp> #in ...
- boost库在windows下的编译和使用
因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- windows下安装boost库
工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行b ...
- boost库(条件变量)
1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...
- Boost库
2014-08-31 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成 ...
- boost库在工作(39)网络UDP异步服务端之九
前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...
随机推荐
- POJ3268 Silver Cow Party(dijkstra+矩阵转置)
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15156 Accepted: 6843 ...
- iOS openURL方法实现打电话、发短信、发邮件、打开其他App
UIApplication有个功能十分强大的openURL:方法 - (BOOL)openURL:(NSURL*)url; 通过这个方法,我们可以实现: 先获取 UIApplication UIApp ...
- 程序猿必备的10款web前端开发插件一
1.CSS3实现的火柴燃烧Loading加载动画 这次我们要给大家分享一款非常特别的CSS3 Loading加载动画,整个Loading加载动画就好像是火柴在燃烧一样,不足的是火苗并没有那么真实,比较 ...
- Unity 角色复活和重新开始游戏
作者写游戏完成的时候,还需要从新想下如何把游戏设置重新开始,角色如何复活. 一般大多数都会采用这种方式来代替游戏重新开始 Application.LoadLevel("xxx场景" ...
- 采用标准c进行目录文件遍历
图像处理的时候经常需要对一个目录的所有图像进行处理,遍历文件得c代码: 在windows中需要使用到宽字符. 另外,可以使用opencv封装的目录访问操作,下次给出. // DirTraverse.c ...
- Riak VClock
Riak VClock 关于向量时钟的概念.在这里就多讲了,大家能够參照一下Dynamo的论文了解一下,向量时钟在分布式主要用于解决一致性性问题.能够和CRDTs一起看. 以下的源码是參照riak中的 ...
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628 前面我们已经学习过Android应 ...
- activity之栈管理
在android中.一个activity组件能够激活还有一个activity组件:本程序activity和其他程序的activity. 若新的被激活的activity组件属于还有一个应用程序, ...
- Jackson的Json转换
public class JacksonJsonUtil { private static ObjectMapper mapper; /** * 获取ObjectMapper实例 * @param c ...
- 根据一个旅游网站的psd素材还原的静态页面
自学web前端的html.css和jquery两个月,想检验下自己的学习成果,遂从网上下了个关于旅游网站的psd素材,自己照着素材还原网站的静态页面. 这是我制作好的静态页面的压缩文件:旅游网站首页. ...