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库之多线程相关推荐

  1. (十二)boost库之多线程高级特性

    很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定义了N中状态,看的让人抓狂.该项目的大 ...

  2. (十一)boost库之多线程间通信

    1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象. # ...

  3. 【Boost】boost库中thread多线程详解1——thread入门与简介

    1. 概述 线程就是,在同一程序同一时间内允许执行不同函数的离散处理队列. 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要. 线程实际上允许同时执行两种函数,而这两个函数 ...

  4. C/C++ 开发 boost 库参考手册整理(2) 【学习笔记】

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  5. Windows下Boost库的安装与使用

    目录 1.基本介绍 2.下载安装 3.配置boost环境(VS2010) 4.测试 1.基本介绍 Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发.维护.其目 ...

  6. 编译后的boost库命名方式

    原文链接:http://www.cnblogs.com/dementia/archive/2009/04/10/1433217.html Boost官网的<Geting Started On W ...

  7. VS2008下直接安装使用Boost库1.46.1版本号

    Boost库是一个可移植.提供源码的C++库,作为标准库的后备,是C++标准化进程的发动机之中的一个. Boost库由C++标准委员会库工作组成员发起,当中有些内容有望成为下一代C++标准库内容.在C ...

  8. Boost库学习(0)

    2019独角兽企业重金招聘Python工程师标准>>> 最近看了C++11标准,感觉C++的变得更强大了,连语法都有了点变化.(最后一次用C++可能还是在学校时,工作中一直用的是C, ...

  9. 在vs2005中安装boost库

    1.在网站下载boost_1_35_0文件包.boost老巢 . 2. 由于boost是采用其自己的bjam工具通过命令行进行编译的,所以: 如果在Windows下开启console窗口(单击&quo ...

最新文章

  1. 2012年中国移动地图和导航市场研究报告简版
  2. 自定义导航栏,实现缓存,更新缓存,提高效率
  3. python大神交流网站_学习Python必去的8个网站
  4. c# 中通快递对接_快递共配是什么?行业前景怎么样?
  5. windows 下编译 jrtplib-3.9.1 和 jthread-1.3.1
  6. 现代软件工程 10 绩效管理
  7. js题集25--编程训练
  8. Markdown接口文档模板
  9. 解决客户一例:使用域超级管理员打开Exchange 2010发现没有权限
  10. Rasa3 domain官方文档翻译
  11. 戴尔电脑开机卡logo无法开机问题及解决办法
  12. delphi控件属性和事件
  13. vscode能写winform窗体吗_VSCode——愉快的写C#
  14. 地球形状与重力场简述总结
  15. Linux bc小数点前补0
  16. 北京-绕五环骑行(完美环绕)2017-03-11
  17. Python删除字符串中的空格和特殊字符
  18. 在公司三年跌宕起伏的经历
  19. HDU 4466 Triangle(12年成都)
  20. OriginLab OriginPro 2017/2018 b9.5 中文多语言 视频教程

热门文章

  1. 基于jwt的用户鉴权:拦截器概述
  2. Spring Schedule关闭订单
  3. 万能点位图软件_【像素图】复古提花毛衣+秋风落叶十字绣图,非常适合这个季节...
  4. 第三章:系统困境之 忽略过去现在未来构成的时间系统
  5. ArcGIS特殊标注效果的简单实现
  6. 六种排序算法的JavaScript实现以及总结
  7. Rails测试《十一》添加邮件发送程序及测试邮件发送程序
  8. myBatis之事务管理
  9. Scala比较器:Ordered与Ordering
  10. DOM与元素节点内联样式