原文转自 http://blog.csdn.net/lee353086/article/details/4673790

本文主要由线程启动、Interruption机制、线程同步、等待线程退出、Thread Group几个部份组成。

1、线程启动。线程可以从以下四种方式启动:

(1) 用struct结构的operator成员函数启动

struct callable
{
void operator()() { 这里略去若干行代码 }
}; 这里略去若干行代码 Callable x;
Boost::thread t(x);

(2) 以非成员函数形式启动线程

void func(int nP)
{ 这里略去若干行代码
}
这里略去若干行代码
Boost::thread t(func,);

(3) 以成员函数形式启动线程

#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, ));

2、Interruption机制
可以通过thread对象的interrupt函数,通知线程,需要interrupt。线程运行到interruption point就可以退出。Interruption机制举例:

#include "stdafx.h"
#include <iostream>
#include <boost/thread.hpp>
using namespace std; void f()
{
for (int i = ; i < 0x0fffffff; i++)
{
if (i % 0xffffff == )
{
cout << "i=" << ((i & 0x0f000000) >> ) << endl;
cout << "boost::this_thread::interruption_requested()=" << boost::this_thread::interruption_requested() << endl;
if (((i & 0x0f000000) >> ) == )
{
boost::this_thread::interruption_point();
}
}
}
} int _tmain(int argc, _TCHAR* argv[])
{
boost::thread t(f);
t.interrupt();
t.join(); //等待线程结束
return ;
}

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 = ; i < 0x0fffffff; i++)
{
if (i % 0xffffff == )
{
cout << "i=" << ((i & 0x0f000000) >> ) << endl; cout << "boost::this_thread::interruption_requested()" << boost::this_thread::interruption_requested() << endl; if (((i & 0x0f000000) >> ) == )
{
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 ;
}

注意boost::this_thread::disable_interruption这条语句的使用,它可以使大括号内的interruption point不会中断当前线程。

3、线程同步

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)
{
for (int i = ; i < 0x0fffffff; i++)
{
if (i % 0xffffff == )
{
boost::lock_guard<boost::mutex> lock(g_m);
cout << "Name=" << strName << " i=" << ((i & 0x0f000000) >> ) << endl;
}
}
} int _tmain(int argc, _TCHAR* argv[])
{
boost::thread t(f, string("inuyasha"));
boost::thread t2(f, string("kagula"));
boost::thread t3(f, string("kikyou")); {
boost::lock_guard<boost::mutex> lock(g_m);
cout << "thread id=" << t.get_id() << endl;
} t.join();
t2.join();
t3.join(); return ;
}

使用unique lock的例子

#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)
{
cout << "Thread name is " << strName << "-----------------begin" << endl;
for (int i = ; i < 0x0fffffff; i++)
{
if (i % 0xffffff == )
{
boost::unique_lock<boost::mutex> lock(g_m); cout << "Name=" << strName << " i=" << ((i & 0x0f000000) >> ) << endl; lock.unlock();
}
}
cout << "Thread name is " << strName << "-----------------end" << endl;
} int _tmain(int argc, _TCHAR* argv[])
{
boost::thread t(f, string("inuyasha"));
boost::thread t2(f, string("kagula"));
boost::thread t3(f, string("kikyou")); t.join();
t2.join();
t3.join(); return ;
}

同Lock_guard相比
[1]Unique lock中有owns lock成员函数,可判断,当前有没有被lock。
[2]在构造Unique Lock时可以指定boost::defer_lock_t参数推迟锁定,直到Unique Lock实例调用Lock。或采用下面的编码方式使用:
boost::unique_lock<boost::mutex> lock(mut,boost::defer_lock);
boost::unique_lock<boost::mutex> lock2(mut2,boost::defer_lock);
boost::lock(lock,lock2);
[3]它可以和Conditoin_variable配合使用。
[4]提供了try lock功能。

如果线程之间执行顺序上有依赖关系,直接到boost官网中参考条件变量(Condition variables)的使用。官网关于Conditon Variables的说明还是容易看懂的。
注意,使用一个不恰当的同步可能消耗掉1/2以上的cpu运算能力。
Thread Group

线程组使用示例,其中f函数在上面的例子已经定义

int _tmain(int argc, _TCHAR* argv[])
{
boost::thread_group tg;
tg.add_thread(new boost::thread(f,string("inuyasha")));
tg.add_thread(new boost::thread(f,string("kagula")));
tg.add_thread(new boost::thread(f,string("kikyou"))); tg.join_all(); return ;
}

Boost::thread库的使用(转)的更多相关文章

  1. Boost::thread库的使用

    阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...

  2. boost::thread 库的使用

    转载自:http://blog.csdn.net/yockie/article/details/9181939 概要 通过实例介绍boost thread的使用方式,本文主要由线程启动.Interru ...

  3. Boost Thread学习笔记五

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...

  4. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  5. Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...

  6. boost::thread boost库线程

    一.boost::thread的创建 1.线程创建方法一: boost::shared_ptr<boost::thread> writeThread_; boost::function0& ...

  7. c++ boost asio库初学习

    前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...

  8. 【boost】MFC dll中使用boost thread的问题

    项目需要,在MFC dll中使用了boost thread(<boost/thread.hpp>),LoadLibraryEx的时候出现断言错误,去掉thread库引用后断言消失. 百度g ...

  9. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

随机推荐

  1. 用纯CSS实现加载中动画效果

    HTML <div class="pswp__preloader__icn"> <div class="pswp__preloader__cut&quo ...

  2. Git 内部原理之 Git 对象哈希

    在上一篇文章中,将了数据对象.树对象和提交对象三种Git对象,每种对象会计算出一个hash值.那么,Git是如何计算出Git对象的hash值?本文的内容就是来解答这个问题. Git对象的hash方法 ...

  3. 绘制圆形 和 椭圆形:边圆形 imageellipse() 、 填充圆形imagefilledellipse()

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  4. C++实例 MySTLString

    #include <iostream> #include <cstring> #include <string> using namespace std; clas ...

  5. poj 3104 晾衣服问题 最大化最小值

    题意:n件衣服各含有ai水分,自然干一分钟一个单位,放烘干机一分钟k个单位,问:最短时间? 思路: mid为最短时间 如果 a[i]-mid>0说明需要放入烘干机去烘干 烘干的时间为x  那么满 ...

  6. win8 远程桌面时提示凭证不工作问题的终极解决办法

    环境说明 远程办公电脑(放置于公司.自用办公电脑.win8系统) 远程连接客户机(放置于家中.家庭日常所用.win8系统) 故障现象 最近在使用远程桌面连接公司的办公电脑时,突然发现win8系统总是无 ...

  7. BugKu 2B+基于python的opencv的安装-------CTF 盲水印的套路

    BugKu杂项-2B 下载图片后,binwalk下跑一跑,发现有个zip,分离. 值得一提的是,这个zip是伪加密的. 但是你在分离的时候,伪加密的图片也给你分离出来了.这两个图片2B和B2肉眼看起来 ...

  8. Android坐标getLeft,getRight,getTop,getBottom,getLocationInWindow和getLocationOnScreen

    Android中获取坐标点的一些方法解释 一.getLocationInWindow和getLocationOnScreen的区别 // location [0]--->x坐标,location ...

  9. CSU-2172 买一送一

    CSU-2172 买一送一 Description ICPCCamp 有 n 个商店,用 1, 2, -, n 编号.对于任意 i > 1,有从商店 \(p_i\) 到 i 的单向道路. 同时, ...

  10. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...