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 ...
 
随机推荐
- Visual Studio Code和Docker开发asp.net core和mysql应用
			
Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...
 - android TextView 带滚动条,和ScrollView 用法(暂时觉得ScrollView滑动速度比较快)
			
本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...
 - js调用打印机
			
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - iOS5系统API和5个开源库的JSON解析速度测试
			
iOS5系统API和5个开源库的JSON解析速度测试 iOS5新增了JSON解析的API,我们将其和其他五个开源的JSON解析库进行了解析速度的测试,下面是测试的结果和工程代码附件. 我们选择的测试对 ...
 - java学习之文件基本操作
			
一.File类 文件的创建 package file; import java.io.File; import java.io.IOException; public class CreateFile ...
 - Linux学习之十四、管线命令
			
Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php
 - 高级new创建
			
myclass *p = new(pcathe)myclass[10];//限定区域分配内存,覆盖模式,可以避免内存泄漏 #include <iostream> class myclass ...
 - js中调用mangeto的js翻译
			
第一步: <script type="text/javascript"> Translator.add('英文','<?php echo this->__( ...
 - C#获取单个字符的拼音声母
			
public class ConvertToPinYing { /// <summary> /// 汉字转拼音缩写 /// < ...
 - JS继承,原型继承,构造函数的继承,非构造函数"的继承
			
a.原型继承 一.new运算符的缺点 用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法.比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species. function DOG ...