Boost::thread库的使用
2009/11/26
Kagula
阅读对象
本文假设读者有几下Skills
[1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念。
[2]熟悉C++开发,在开发工具中,能够编译、设置boost::thread库。
环境
[1]Visual Studio 2005/2008 with SP1
[2]boost1.39/1.40
概要
通过实例介绍boost thread的使用方式,本文主要由线程启动、Interruption机制、线程同步、等待线程退出、Thread Group几个部份组成。
正文
线程启动
线程可以从以下三种方式启动:
第一种用struct结构的operator成员函数启动:
struct callable
{
void operator()() { 这里略去若干行代码 }
};
这里略去若干行代码
Callable x;
Boost::thread t(x);
第二种以非成员函数形式启动线程
void func(int nP)
{ 这里略去若干行代码
}
这里略去若干行代码
Boost::thread t(func,123);
第三种以成员函数形式启动线程
#include <boost/bind.hpp>
这里略去若干行代码
class testBind{
public:
void testFunc(int i)
{
cout<<”i=”<<i<<endl;
}
};
这里略去若干行代码
testBind tb;
boost::thread t(boost::bind(&testBind::testFunc,&tb,100));
Interruption机制
可以通过thread对象的interrupt函数,通知线程,需要interrupt。线程运行到interruption point就可以退出。
Interruption机制举例:
#include "stdafx.h"
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
void f()
{
for(int i=1;i<0x0fffffff;i++)
{
if(i%0xffffff==0)
{
cout<<"i="<<((i&0x0f000000)>>24)<<endl;
cout<<"boost::this_thread::interruption_requested()="<<boost::this_thread::interruption_requested()<<endl;
if(((i&0x0f000000)>>24)==5)
{
boost::this_thread::interruption_point();
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread t(f);
t.interrupt();
t.join(); //等待线程结束
return 0;
}
t.interrupt();告诉t线程,现在需要interrupt。boost::this_thread::interruption_requested()可以得到当前线程是否有一个interrupt请求。若有interrupt请求,线程在运行至interruption点时会结束。boost::this_thread::interruption_point();就是一个interruption point。Interruption point有多种形式,较常用的有boost::this_thread::sleep(boost::posix_time::seconds(5));当没有interrupt请求时,这条语句会让当前线程sleep五秒,若有interrupt requirement线程结束。
如何使线程在运行到interruption point的时候,不会结束,可以参考下面的例子:
#include "stdafx.h"
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
void f()
{
for(int i=1;i<0x0fffffff;i++)
{
if(i%0xffffff==0)
{
cout<<"i="<<((i&0x0f000000)>>24)<<endl;
cout<<"boost::this_thread::interruption_requested()"<<boost::this_thread::interruption_requested()<<endl;
if(((i&0x0f000000)>>24)==5)
{
boost::this_thread::disable_interruption di;
{
boost::this_thread::interruption_point();
}
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread t(f);
t.interrupt();
t.join(); //等待线程结束
return 0;
}
注意boost::this_thread::disable_interruption这条语句的使用,它可以使大括号内的interruption point不会中断当前线程。
线程同步
Boost提供了多种lock导致上手需要较长时间,还是看下面线程同步的例子比较简单,相信在多数应用中足够:
直接使用boost::mutex的例子
static boost::mutex g_m;
这里略去若干行代码
g_m.lock();
需要锁定的代码
g_m.unlock();
这里略去若干行代码
if(g_m.try_lock())
{
需要锁定的代码
}
这里略去若干行代码
使用lock guard的例子
#include <iostream>
#include <string>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/locks.hpp>
using namespace std;
static boost::mutex g_m;
void f(string strName)