Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET
Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET
Boost::Thread的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的线程选项的不同,分别决定使用Windows线程API,pThread,或Mac平台的thread实现。以下只讨论Windows,即使用BOOST_HAS_WINTHREAD的情况。
Boost::Thread有两个构造函数:一个是thread(),构造一个表示当前执行线程的线程对象;一个是explicit thread(const boost::function0<void>& threadfunc),这里的boost::function0<void>可以简单看为一个无返回无参数的函数。这里的函数可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,可以看下面的几个例子。
(1)最简单方法
- #include <boost/thread/thread.hpp>
- #include <iostream>
- void hello()
- {
- std::cout<<"Hello world, I'm a thread!"<<std::endl;
- }
- int main()
- {
- boost::thread thrd(&hello);
- thrd.join();
- system("pause");
- return 0;
- }
#include <boost/thread/thread.hpp>
#include <iostream> void hello()
{
std::cout<<"Hello world, I'm a thread!"<<std::endl;
} int main()
{
boost::thread thrd(&hello);
thrd.join(); system("pause");
return 0;
}
(2)复杂类型对象作为参数来创建线程
- #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);
- std::cout<<id<<": "<<i<<std::endl;
- }
- }
- int id;
- };
- int main()
- {
- boost::thread thrd1(count(1));
- boost::thread thrd2(count(2));
- thrd1.join();
- thrd2.join();
- system("pause");
- return 0;
- }
#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);
std::cout<<id<<": "<<i<<std::endl;
}
} int id;
}; int main()
{
boost::thread thrd1(count(1));
boost::thread thrd2(count(2));
thrd1.join();
thrd2.join(); system("pause");
return 0;
}
(3)在类内部创建线程
类内部静态方法启动线程
- #include <boost/thread/thread.hpp>
- #include <iostream>
- class HelloWorld
- {
- public:
- static void hello()
- {
- std::cout<<"Hello world, I'm a thread!"<<std::endl;
- }
- static void start()
- {
- boost::thread thrd(hello);
- thrd.join();
- }
- };
- int main()
- {
- HelloWorld::start();
- system("pause");
- return 0;
- }
#include <boost/thread/thread.hpp>
#include <iostream> class HelloWorld
{
public:
static void hello()
{
std::cout<<"Hello world, I'm a thread!"<<std::endl;
}
static void start()
{
boost::thread thrd(hello);
thrd.join();
}
}; int main()
{
HelloWorld::start(); system("pause");
return 0;
}在这里,start()和hello()方法都必须是static方法。如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:
- #include <boost/function/function0.hpp>
- #include <boost/thread/thread.hpp>
- #include <iostream>
- class HelloWorld
- {
- public:
- void hello()
- {
- std::cout<<"Hello world, I'm a thread!"<<std::endl;
- }
- void start()
- {
- boost::function0<void> f = boost::bind(&HelloWorld::hello, this);
- boost::thread thrd(f);
- thrd.join();
- }
- };
- int main()
- {
- HelloWorld hello;
- hello.start();
- system("pause");
- return 0;
- }
#include <boost/function/function0.hpp>
#include <boost/thread/thread.hpp>
#include <iostream> class HelloWorld
{
public:
void hello()
{
std::cout<<"Hello world, I'm a thread!"<<std::endl;
}
void start()
{
boost::function0<void> f = boost::bind(&HelloWorld::hello, this);
boost::thread thrd(f);
thrd.join();
}
}; int main()
{
HelloWorld hello;
hello.start(); system("pause");
return 0;
}(3)在Singleton模式内部创建线程:
- #include <boost/thread/thread.hpp>
- #include <iostream>
- class HelloWorld
- {
- public:
- void hello()
- {
- std::cout<<"Hello world, I'm a thread!"<<std::endl;
- }
- static void start()
- {
- boost::thread thrd(boost::bind(&HelloWorld::hello, &HelloWorld::getInstance()));
- thrd.join();
- }
- static HelloWorld& getInstance()
- {
- if(!instance)
- instance = new HelloWorld;
- return *instance;
- }
- private:
- HelloWorld() {}
- static HelloWorld* instance;
- };
- HelloWorld* HelloWorld::instance = 0;
- int main()
- {
- HelloWorld::start();
- system("pause");
- return 0;
- }
#include <boost/thread/thread.hpp>
#include <iostream> class HelloWorld
{
public:
void hello()
{
std::cout<<"Hello world, I'm a thread!"<<std::endl;
}
static void start()
{
boost::thread thrd(boost::bind(&HelloWorld::hello, &HelloWorld::getInstance()));
thrd.join();
}
static HelloWorld& getInstance()
{
if(!instance)
instance = new HelloWorld;
return *instance;
}
private:
HelloWorld() {}
static HelloWorld* instance;
}; HelloWorld* HelloWorld::instance = 0;
int main()
{
HelloWorld::start(); system("pause");
return 0;
}(4)用类内部函数在类外部创建线程
- #include <boost/thread/thread.hpp>
- #include <iostream>
- #include <string>
- class HelloWorld
- {
- public:
- void hello(const std::string& str)
- {
- std::cout<<str<<std::endl;
- }
- };
- int main()
- {
- HelloWorld obj;
- boost::thread thrd(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread!"));
- thrd.join();
- system("pause");
- return 0;
- }
#include <boost/thread/thread.hpp>
#include <iostream>
#include <string> class HelloWorld
{
public:
void hello(const std::string& str)
{
std::cout<<str<<std::endl;
}
}; int main()
{
HelloWorld obj;
boost::thread thrd(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread!"));
thrd.join(); system("pause");
return 0;
}
- 如果需要绑定的函数有参数则需要使用boost::bind。比如想使用boost::thread创建一个线程来执行函数void f(int i),如果这样写boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的函数,而且不提供参数f也无法运行,这时就可以写boost::thread thrd(boost::bind(f, 1))。涉及到有参函数的绑定问题基本上都是boost::thread、boost::function、boost::bind结合起来使用。
如果需要绑定的函数有参数则需要使用boost::bind。比如想使用boost::thread创建一个线程来执行函数void f(int i),如果这样写boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的函数,而且不提供参数f也无法运行,这时就可以写boost::thread thrd(boost::bind(f, 1))。涉及到有参函数的绑定问题基本上都是boost::thread、boost::function、boost::bind结合起来使用。参考:
http://www.cnblogs.com/VRS_technology/archive/2010/09/15/1826812.html
http://www.blogjava.net/LittleDS/archive/2008/05/18/201236.html
Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET的更多相关文章
- boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET
boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost::crc_32_type crc32; crc32. ...
- boost:regex分割字符串(带有'\'字符) - zzusimon的专栏 - 博客频道 - CSDN.NET
boost:regex分割字符串(带有'\'字符) - zzusimon的专栏 - 博客频道 - CSDN.NET boost:regex分割字符串(带有'\'字符) 分类: C++ 2011-08- ...
- Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET 让 QtWebkit 支持跨域CROS 2013-05-23 22:05 450人阅读 评论 ...
- Cannot call sendError() after the response has been committed - baiyangliu - 博客频道 - CSDN.NET
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- CUDA从入门到精通 - Augusdi的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/augusdi/article/details/12833235 CUDA从入门到精通 - Augusdi的专栏 - 博客频道 - CSDN.NET CUDA ...
- 最牛B的编码套路 - 呦呦鹿鸣 - 博客频道 - CSDN.NET
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN
Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN.NET http://blog.csdn.net/borishuai/article/details ...
随机推荐
- javascript 数据结构和算法读书笔记 > 第二章 数组
这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...
- php 垃圾回收机制----写时复制和引用计数
PHP使用引用计数和写时复制来管理内存.写时复制保证了变量间复制值不浪费内存,引用计数保证了当变量不再需要时,将内存释放给操作系统. 要理解PHP内存管理,首先要理解一个概念----符号表. 符号表的 ...
- Delphi RichEdit的内容保存为图片
uses RichEdit; {将RichEdit1的内容保存为图片,此函数也适合于RxRichEdit,即RichEdit: TRxRichEdit}procedure RichEditToCanv ...
- CC++初学者编程教程(7) 搭建Windows EclipseCCPP软件开发环境
1根据电脑是32位还是64位来选择工具 2 查看电脑是64位 3 管理员身份运行这个文件 4 安装JDK64位 5. 下一步 6 开始安装 7 安装JAVA 8 安装进行时 9 安装成功 10解压缩 ...
- 用sql语句按周、按月、按季、按年统
原文地址:http://hi.baidu.com/%BD%F0%D3%F1kl_y/blog/item/1c368ffba9388476024f5645.html --按mySql语法统计按周,月,季 ...
- poj1423---求一个大数的位数方法,我猜网站上统计输入字符少于多少位的那个算法
法一:对一个数求它的对数,+1取整为其位数 问题转化为int (log10(N!)+1),对数性质log10(N!)=log10(N)+log10(N-1)+...+log10(1) /*用log10 ...
- Java学习-练习1
题目描述: 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到, 而这对数字各包含乘积的一半位数的数字,其中最初的数字中可以 选取的数字可以任意排序,以两个0结尾的数字是不允许的,例如,下 面的 ...
- 适合入门自学服装裁剪滴书(更新ing)
[♣]适合入门自学服装裁剪滴书(更新ing) [♣]适合入门自学服装裁剪滴书(更新ing) 适合入门自学服装裁剪滴书(更新ing) 来自: 裁缝阿普(不为良匠,便为良医.) 2014-04-06 23 ...
- Spring、实例化Bean的三种方法
1.使用类构造器进行实例化 <bean id="personIService" class="cn.server.impl.PersonServiceImpl&qu ...
- javascript第九课"闭包"
所谓闭包:就是一个函数内部又定义了一个函数,而这个函数能访问外部函数作用域范围内的变量,这个内部函数就叫做闭包! js中的面向对象都是使用闭包来实现的 闭包里使用的变量会现在当前函数内搜索,没有的 ...