使用boost::thread跨平台多线程 (一) 基本使用

原创 2007年09月12日 00:35:00

使用boost::thread跨平台多线程 (一) 基本使用

作者: 江淼
Blog: http://blog.csdn.net/jiangfriend
时间: 2007-9-12 00:31

关于boost::thread的概述我也不多说,一句话,boost的跨平台的多线程库,我们直接切入正题。

一、基本使用

头文件 <boost/thread/thread.hpp>
namespace boost {
  class thread;
  class thread_group;
}

1、thread
thread的构造形式为explicit thread(const boost::function0<void>&);
如果你对boost::function不熟,那么我听我简短的介绍一下:
boost::function0<void>可以简单看为:一个无返回(返回void),无参数的函数。
这里的函数也可以是类重载operator()构成的函数。

举例来说如下形都可以转化为function0<void>。
void run(void)
{
}

struct Run
{
    void operator()(void) {}
};

只要带参数构造一个thread实例那么就是构建了一个线程,相当的方便快捷。
于是有了我们第一个例子:
例一:

#include <boost/thread.hpp>
#include <iostream>

struct Run
    {
    void operator()(void)
        {
   
        std::cout<<__FUNCTION__<<std::endl;
        }
    };
void run(void)
    {
    std::cout<<__FUNCTION__<<std::endl;
    }

int main(int argc, char* argv[])
    {
    Run r;
    boost::thread thrd(r);
    boost::thread thrdb(run);
    return 0;
    }

运行后发生了什么?线程起动了,但一闪而过,结果都没能输出全就运行结束了。那该怎么办呢?
答:使用thread::join,当join后的thread在该线程未执行结束会一直处于阻塞状态。

改下例子中主程序main为
    {
    Run r;
    boost::thread thrd(r);
    boost::thread thrdb(run);
    thrd.join();
    thrdb.join();
    return 0;
    }
看到结果了,但似乎线程有点不同步,呃。。暂时放在一旁吧。
什么?你觉得void(void)的函数连变量入口都没,传值不方便?其实你错了,当你用会了boost::bind,会发现函数有多少参数都不是问题,都可以轻松bind为void(void)形式。我几乎可以说boost::thread最基本的的使用就是boost::thread+boost::function+boost::bind的结合。

2、thread_group
大家一定注意到除了thread还有thread_group,顾名思义,thread_group就是thread的group,看看main主程序有点烦琐,引入thread_group看看效果
先认识下thread_group的成员函数:

thread* create_thread(const boost::function0<void>&); //创建一个线程
void add_thread(thread*); //加入一个已存在的线程
void remove_thread(thread*); //移除一个线程
void join_all(); //全部等待结束

很清晰,改造开始
    {
    Run r;
    boost::thread_group grp;
    grp.create_thread(r); //使用create_thread
    grp.add_thread(new boost::thread(run)); //使用add_thread
    grp.join_all();
    return 0;
    }
运行,结果完全一样。

注意:当thread_group析构时会自动delete已加入的thread

    {
    boost::thread_group grp;
    boost::thread* thrd=grp.create_thread(r);
    grp.join_all();
    delete thrd;
    } //错误, grp在析构时对已删除的thrd再进行删除

若要手动管理,可改为:
    {
    Run r;
    boost::thread_group grp;
    boost::thread* thrd=grp.create_thread(r);
    grp.join_all();
    grp.remove_thread(thrd); //把thrd移出grp
    delete thrd;
    return 0;
    }

好了,以上就是thread的最基本的使用方法。

相关链接:

boost官方网站 http://www.boost.org
boost::thread 帮助文档 http://www.boost.org/doc/html/thread.html
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

boost库中thread多线程详解

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

【Boost】boost库中thread多线程详解6——线程组简单例子

[cpp] view plain copy  print? namespace    {       struct Run    ...

boost::asio::io_service和io_service::work和boost::thread_group配合使用

学习boost的 //注释中的Page是指:Boost程序库完全开发指南(第三版) #include //Page542: 在头文件前定义此宏,它就会向标准流cerr输出运行日志。 //#defin...

Boost::thread库的使用

概要 通过实例介绍boost thread的使用方式,本文主要由线程启动、Interruption机制、线程同步、等待线程退出、Thread Group几个部份组成。 正文 线程...
  • yockie
  • yockie
  • 2013-06-26 19:32
  • 6547

使用boost::thread跨平台多线程 (二) 线程同步-互斥

使用boost::thread跨平台多线程 (二) 线程同步-互斥 作者: 江淼 Blog: http://blog.csdn.net/jiangfriend 时间: 2007-9-...

BOOST 库 thread类线程使用 多线程处理的理解

hread库为C++增加了线程处理能力,它提供简明清晰的线程、互斥量等概念,可以容易地创建多线程应用程序。thread库也是高度可移植的,它支持使用最广泛的windows和POSIX[Unix下应用程...

<Boost> boost::thread 多线程的使用

boost::thread参考帮助文档:http://www.boost.org/doc/libs/1_57_0/doc/html/thread.html 1. Windows的多线程 参考博文:...

【Java】多线程<1>-概念及Thread类基本使用

问题一:多线程是什么? 一个程序可能包括多个并发执行的任务,线程指其中一个任务从头到尾的执行流。简单来说,多线程就是在一个程序中提供并发执行多个任务。 问题二:什么时候才要用到多线程? ...

Java多线程——thread及runnable的基本使用及交替执行

/** * Created by LiuHuiChao on 2016/3/11. */ public class Actor extends Thread { @Override ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)