(十)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库之多线程的更多相关文章

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

    (十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...

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

    (十一)boost库之多线程间通信 1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一 ...

  3. boost库:多线程

    1.线程管理 最重要的一个类是boost::thread,是在boost/thread.hpp里定义的,用来创建一个新线程. #include <boost/thread.hpp> #in ...

  4. boost库在windows下的编译和使用

    因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...

  5. 新手,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 ...

  6. windows下安装boost库

    工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行b ...

  7. boost库(条件变量)

    1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...

  8. Boost库

    2014-08-31 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成 ...

  9. boost库在工作(39)网络UDP异步服务端之九

    前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...

随机推荐

  1. USB的VID和PID,以及分类(Class,SubClass,Protocol)

    USB(Universal Serial BUS,通用串行总线)协议规定,所有的USB设备都有VID(Vendor ID,供应商识别码)和PID(Product ID,产品识别码).VID由供应商向U ...

  2. YY语音从4.0版本开始是基于Qt的开发过程,以及碰到的问题

    作者:姚冬链接:http://www.zhihu.com/question/21359230/answer/20127715来源:知乎著作权归作者所有,转载请联系作者获得授权. YY语音从4.0版本开 ...

  3. HTML5视音频小结

    目前,大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件.HTML5 规定了一种通过 video 元素来包含视频的标准方法.当前HTML5只支持三种格式的视频. 格 ...

  4. 2014第2周三Web安全学习

    2014第2周三Web安全学习 先记录下自己关于json和xml作为数据传递媒介的差异:在写一个java方法时我将正确结果返回的对象转成json返回,将错误结果根据不同原因以xml形式返回,同事看后有 ...

  5. MySQL无法重启问题解决Warning: World-writable config file ‘/etc/my.cnf’ is ignored

    MySQL无法重启问题解决Warning: World-writable config file ‘/etc/my.cnf’ is ignored

  6. Unity 为自己组件添加公共方法

    为什么需要跟你的组件添加公共方法呢? 留一条后路嘛,万一你那天想起要给全部的组件添加一个方法. 此时我只能告诉你慢慢修改吧累死你 子组件:A ,父组件:B继承方式:  A -> B –> ...

  7. 力挺8天入门wpf【转载】

    8天入门wpf—— 第八天 最后的补充 摘要: 从这一篇往前看,其实wpf中还有很多东西没有讲到,不过我的原则还是将比较常用的知识点过一遍,如果大家熟悉了这些知识,基本功也就打的差不多了,后续可以等待 ...

  8. asp.net关于Repeater控件中的全选,批量操作

    今天在Repeater控件中碰到一个全选的操作,于是上网查了一下,找到一个觉得比较好,便记录下来, 界面代码简化之后(全选操作): <script type="text/javascr ...

  9. 《JavaScript 闯关记》之语法

    JavaScript 的语法大量借鉴了 C 及其他类 C 语言(如 Java 和 Perl)的语法.因此,熟悉这些语言的开发人员在接受 JavaScript 更加宽松的语法时,一定会有种轻松自在的感觉 ...

  10. 归并排序java

    import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort ...