(十)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服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...
随机推荐
- USB class总结
以下是总结的USB的类,不同的USB类,主机询问的描述符格式和内容都不一样,具体的descriptor的内容可以查看 USB spec(http://www.usb.org/home/),如HID的s ...
- [置顶] SPL讲解(4)--Criteria操作篇
概念 以前一篇文章中,描述了实体Entity的操作,很明显,仅仅实体的操作是远远不够的.如:我们经常会根据查询条件从数据库中获取记录集并绑定到DataGrid上,会根据条件进行批量的Update和De ...
- linux下mysql数据库的操作
本文主要针对linux下mysql数据库的安装,以及数据库的创建和简单的数据库操作进行说明. ①.Mysql数据库的安装: 数据库的安装分为源码安装和rpm安装. 当然对于老手来说需要进行一些自定义的 ...
- 点滴记录——Centos 6.5 yum安装Ganglia
转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701141 注:下面操作都仅仅是在一台机器上操作 1. 安装php支持 yum inst ...
- MVC4 jquery 样式 主题 用法(案例)
MVC4已经自带了jquery,新建的项目,基本上什么都不用添加就可以运行,跑项目.(集成了那么多东西,jquery,modernizr,自带的默认权限,生成的模板,但是缺没有一个统一的文档或者什么去 ...
- nginx默认虚拟主机
server { listen 80 default_server; server_name localhost; index index.html index.htm index.php; root ...
- 《JavaScript 闯关记》之函数
函数是一段代码,它只定义一次,但可以被执行或调用任意次.在 JavaScript 里,函数即对象,程序可以随意操控它们.比如,可以把函数赋值给变量,或者作为参数传递给其他函数,也可以给它们设置属性,甚 ...
- Hadoop: Start-all.sh 后发现JPS后Namenode没有启动
重新格式化Namenode:hadoop namenode -format 然后启动hadoop:start-all.sh 执行下JPS命令就可以看到NameNode了
- C# Winform中执行post操作并获取返回的XML类型的数据
/// <summary> /// 返回指定日期的订单数据 /// </summary> /// <param name="StartDate"> ...
- oracle取分组的前N条数据
select * from(select animal,age,id, row_number()over(partition by animal order by age desc) row_num ...