转载自:http://blog.csdn.net/yockie/article/details/9181939

概要

通过实例介绍boost thread的使用方式,本文主要由线程启动、Interruption机制、线程同步、等待线程退出、Thread Group几个部份组成。

正文

线程启动

线程可以从以下三种方式启动:第一种用struct结构的operator成员函数启动:

#include<iostream>
#include <boost/thread.hpp> struct Callable
{
void operator()()
{ //do something here
std::cout<<"thread running structure operator ()!"<<std::endl;
}
}; int main()
{
Callable x;
boost::thread st(x); return ;
}

第二种以非成员函数形式启动线程

void func(int para)
{
std::cout<<"thread runnign non-class function"<<"\t"<<para<<std::endl; } int main()
{ boost::thread f(func, );
return ;
}

第三种以成员函数形式启动线程

#include<boost/bind.hpp>
#include<iostream>
#include<boost/thread.hpp> class TestBind
{
public:
void testFunc(int c)
{
std::cout<<"thread running class member functions!"<<"\t"<<c<<std::endl;
} }; int main()
{
TestBind testBind;
boost::thread cf(boost::bind(&TestBind::testFunc, &testBind, ));
return ; }

Interruption机制

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

#include <iostream>
#include <boost/thread.hpp>
using namespace std; void f()
{
for(int i=;i<0x0fffffff;i++)
{
if(i%0xffffff==)
{
std::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 main()
{
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的时候,不会结束,可以参考下面的例子:

void f()
{
for(int i=;i<0x0fffffff;i++)
{
if(i%0xffffff==)
{
std::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(); boost::this_thread::disable_interruption di;
{
boost::this_thread::interruption_point();
}
}
}
}
}

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

线程同步

Boost提供了多种lock导致上手需要较长时间,还是看下面线程同步的例子比较简单,相信在多数应用中足够:直接使用boost::mutex的例子

static boost::mutex g_m;
//do something here
g_m.lock();
//do something what needs to be locked
g_m.unlock(); if(g_m.try_lock())
{
  //do something what needs to be locked
} 
#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/lee353086/article/details/4673790 本文主要由线程启动.Interruption机制.线程同步.等待线程退出.Thr ...

  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. hive_学习_02_hive整合hbase(失败)

    一.前言 本文承接上一篇:hive_学习_01_hive环境搭建(单机) ,主要是记录 hive 整合hbase的流程 二.环境准备 1.环境准备 操作系统 : linux CentOS 6.8 jd ...

  2. mac环境下利用MAMP配置PHPStorm

    刚刚准备搞php稍微研究一下,结果第一步就卡到了.各种配置问题,教程找了又找,找了又找,总算是成功了.纪念一下.配置截图.同时解决phpstorm 不能接受post 表单数据的问题. 推荐大家支持正版 ...

  3. 在Mac上激活Adobe产品

    1.在任意位置下载需要的Adobe软件(推荐官网正版) 网速不好或者不通推荐下载离线安装包: https://helpx.adobe.com/download-install/kb/creative- ...

  4. C#面向对象(四):其他面向对象知识

    前文链接: C#面向对象(一):明确几个简单的概念作为开胃菜 C#面向对象(二):封装和继承 C#面向对象(三):多态 今天是这个系列的收尾文章了,来谈谈其他面向对象知识. 1.嵌套类 1.1概念 在 ...

  5. 【LeetCode】075. Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  6. swing之borderlayout

    import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; //1.继承 JFrame类 ...

  7. CommonJS 规范

    CommonJS 是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中. 这个项目最开始是由 Mozilla 的工程师 Kevin Dangoor 在2 ...

  8. C++语言对C的增强(1)——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符

    1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.变量检测加强 在C语言中,重复定义多个同名的全局变量是合法的: ...

  9. bzoj 4591 [Shoi2015]超能粒子炮·改——组合数前缀和

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591 先说说自己的想法: 从组合意义的角度考虑,从n个里选<=k个,就添加k个空位置, ...

  10. Nginx解决错误413 Request Entity Too Large

    最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报 ...