boost::thread简要分析(1):thread

原创 2005年05月27日 08:47:00
昨天在写作“大卫的Design Patterns学习笔记”过程中,编写了一个多线程Producer-Consumer的示例,其中用到了boost::thread,但在线程同步的问题上遇到了些问题,到csdn和vckbase上发帖子问了一下,也没人回答,没有办法,只好晚上回家搬出源码研究了一下,总算解决了问题,下面将自己的理解写下来,与大家分享、讨论。
注:以下讨论基于boost1.32.0

boost::thread库跟boost::function等很多其它boost组成库不同,它只是一个跨平台封装库(简单的说,就是根据不同的宏调用不同的API),里面没有太多的GP编程技巧,因此,研究起来比较简单。

boost::thread库主要由以下部分组成:
thread
mutex
scoped_lock
condition
xtime
barrier
下面依次解析如下:

thread
thread自然是boost::thread库的主角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用Windows线程API还是pthread,或者Macintosh Carbon平台的thread实现。以下只讨论Windows,即使用BOOST_HAS_WINTHREADS的情况。
thread类提供了两种构造函数:
thread::thread()
thread::thread(const function0<void>& threadfunc)
第一种构造函数用于调用GetCurrentThread构造一个当前线程的thread对象,第二种则通过传入一个函数或者一个functor来创建一个新的线程。第二种情况下,thread类在其构造函数中间接调用CreateThread来创建线程,并将线程句柄保存到成员变量m_thread中,并执行传入的函数,或执行functor的operator ()方法来启动工作线程。
此外,thread类有一个Windows下的程序员可能不大熟悉的成员函数join,线程(通常是主线程)可以通过调用join函数来等待另一线程(通常是工作线程)退出,join的实现也十分简单,是调用WaitForSingleObject来实现的:
WaitForSingleObject(reinterpret_cast<HANDLE>(m_thread), INFINITE);
我们可以用以下三种方式启动一个新线程:
1
、传递一个工作函数来构造一个工作线程
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>

boost::mutex io_mutex;

void
 count()    // worker function
{
    for
 (int i = 0; i < 10; ++i)
    {

        boost::mutex::scoped_lock lock(io_mutex);
        std::cout << i << std::endl;
    }
}


int
 main(int argc, char* argv[])
{

    boost::thread thrd1(&count);
    boost::thread thrd2(&count);
    thrd1.join();
    thrd2.join();

    return
 0;
}

2
、传递一个functor对象来构造一个工作线程
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>

boost::mutex io_mutex;

struct
 count
{

    count(int id) : id(id) { }

    void
 operator()()
    {

        for
 (int i = 0; i < 10; ++i)
        {

            boost::mutex::scoped_lock lock(io_mutex);        // lock io, will be explained soon.
            std::cout << id << ": " << i << std::endl;
        }
    }


    int
 id;
};


int
 main(int argc, char* argv[])
{

    boost::thread thrd1(count(1));
    boost::thread thrd2(count(2));
    thrd1.join();
    thrd2.join();
    return
 0;
}

3
、无需将类设计成一个functor,借助bind来构造functor对象以创建工作线程
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>

boost::mutex io_mutex;

struct
 count
{

    static
 int num;
    int
 id;

    count() : id(num++) {}

    int
 do_count(int n)
    {

        for
 (int i = 0; i < n; ++i)
        {

            boost::mutex::scoped_lock lock(io_mutex);
            std::cout << id << ": " << i << std::endl;
        }

        return
 id;
    }
};


int
 count::num = 1;

int
 main(int argc, char* argv[])
{

    count c1;
    boost::thread thrd1(boost::bind(&count::do_count, &c1, 10));
    thrd1.join();
    return
 0;
}

其中bind是一个函数模板,它可以根据后面的实例化参数构造出一个functor来,上面的boost::bind(&count::do_count, &c1, 10)其实等价于返回了一个functor:
struct
 countFunctor
{

    int
 operator() ()
    {
        (&
c1)->do_count(10);    // just a hint, not actual code
    }
};

因此,以后就跟2中是一样的了。

boost::thread简要分析(2):线程同步

除了thread,boost::thread另一个重要组成部分是mutex,以及工作在mutex上的boost::mutex::scoped_lock、condition和barrier,这些都是为实...

新手,Visual Studio 2013 配置Boost库。 如何编译和选择,遇到无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法

VS2013 配置Boost

Visual Studio 2013 配置Boost库。 如何编译和选择,遇到无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法

1.首先你需要去下载最新的boost,www.boost.org ,我下的1.58版本。 2.解压到文件夹,我解压到了E:\boost。 3.在开始菜单打开Visual Studio Tools,...

Java中继承thread类与实现Runnable接口区别的简要的分析

原文链接:http://mars914.iteye.com/blog/1508429

【Boost系列】boost库中thread多线程详解1

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

【Boost】boost库中thread多线程详解1

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

C++_Boost_Thread_编程指南

  • 2014年04月15日 21:52
  • 79KB
  • 下载

Boost_thread库例程

  • 2012年07月19日 17:40
  • 19KB
  • 下载

利用thread来简要模拟signal函数功能

对于程序员来说, 代码比文字有趣多了, 所以我们少说废话, 多玩代码。 我们先来看一个简单的多线程程序(test.c):...
  • stpeace
  • stpeace
  • 2015年04月25日 22:26
  • 889

boost thread扩展

  • 2008年09月10日 19:11
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost::thread简要分析(1):thread
举报原因:
原因补充:

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