boost多线程使用简例
原文链接:http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html
C++ Boost Thread 编程指南
转自cnblog: http://www.cnblogs.com/chengmin/archive/2011/12/29/2306416.html
Boost::Thread使用示例
转自: http://blog.csdn.net/zhuxiaoyang2000/article/details/6588031
罗素实验室的分析:
转自: http://www.rosoo.net/a/200912/8082.html
boost锁的概述:
原文链接:http://blog.csdn.net/hbhhww/article/details/7416170
Boost多线程编程
背景
• 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率;为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序;
GUI应用程序将那些费时,复杂的处理以线程的形式单独运行,以此来保证用户界面能够及时响应用户的操作。这样使用多线程的例子还有很多。
• 跨平台
最近在做一个消息中间件里面涉及到多线程编程,由于跨平台的原因我采用了boost线程库。在创建线程时遇到了几种线程创建方式现总结如下:
首先看看boost::thread的构造函数吧,boost::thread有两个构造函数:
(1)thread():构造一个表示当前执行线程的线程对象;
(2)explicit thread(const boost::function0<void>& threadfunc):
boost::function0<void>可以简单看为:一个无返回(返回void),无参数的函数。这里的函数也可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,在下面有例子。
第一种方式:最简单方法
#include <boost/thread/thread.hpp>
#include <iostream> void hello()
{ std::cout << "Hello world, I''m a thread!" << std::endl;
} int main(int argc, char* argv[])
{ boost::thread thrd(&hello); thrd.join(); 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(int argc, char* argv[])
{ boost::thread thrd1(count(1)); boost::thread thrd2(count(2)); thrd1.join(); thrd2.join(); return 0;
}
第三种方式:在类内部创建线程;
(1)类内部静态方法启动线程
#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(int argc, char* argv[])
{HelloWorld::start();return 0;
}
在这里start()和hello()方法都必须是static方法。
(2)如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:
#include <boost/thread/thread.hpp>
#include <boost/bind.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(int argc, char* argv[])
{HelloWorld hello;hello.start();return 0;
}
(3)在Singleton模式内部创建线程:
#include <boost/thread/thread.hpp>
#include <boost/bind.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(int argc, char* argv[])
{HelloWorld::start();return 0;
}
第四种方法:用类内部函数在类外部创建线程;
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <string>
#include <iostream>
class HelloWorld
{
public:void hello(const std::string& str){std::cout <<str<< std::endl;}
}; int main(int argc, char* argv[])
{ HelloWorld obj;boost::thread thrd( boost::bind(&HelloWorld::hello,&obj,"Hello world, I''m a thread!" ) ) ;thrd.join();return 0;
}
如果线程需要绑定的函数有参数则需要使用boost::bind。比如想使用 boost::thread创建一个线程来执行函数:void f(int i),如果这样写:boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的型别,而且不提供参数i的值f也无法运行,这时就可以写:boost::thread thrd(boost::bind(f,1))。涉及到有参函数的绑定问题基本上都是boost::thread、boost::function、boost::bind结合起来使用
boost多线程使用简例相关推荐
- Android SurfaceView简例
Android SurfaceView简例 Android中各的SurfaceView和View有很大的不同,两者应用场景不同.大多数View能做的事情SurfaceView也可以,但是Surface ...
- oracle供应商导入,AP供应商导入简例.pdf
AP供应商导入简例 Oracle 完全测试记录 供应商导入 吴若童 总述总述 总述总述 供应商供应商接口接口的原理的原理?? 供应商供应商接口接口的原理的原理?? 系统从三个表分别导入供应商.供应商地 ...
- Android RuntimePermissions运行时权限:单个运行时权限申请简例
Android RuntimePermissions运行时权限:单个运行时权限申请简例 Android运行时权限申请的框架结构和步骤比较简单和固定,一般现状代码启动后检查当前的Android SDK版 ...
- Boost多线程-替换MFC线程
Mfc的多线程看起来简单,可以把线程直接压入向量,由系统类似进行调配,其实在内存的处理问题上留下了漏洞.在新线程里面载入大量流,会导致内存泄露. 方便之处:直接使用结构体传入函数参数,供函数使用. 使 ...
- 9 C++ Boost 多线程,线程同步
线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死 ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- Ansible 入门:安装 简例 playbook应用
Mysql 内:select unix_timestamp('2016-10-20') <---> select from_unixtime(147662104) 转时间戳:date + ...
- 6005.boost多线程与mavlink协议结合实现消息收发
boost多线程与mavlink协议结合实现消息收发 本文将实现boost库创建多线程,利用mavlink协议进行数据链消息打包.解包,解放了很多数据解析的工作,不得不佩服mavlink协议功能的强大 ...
- C# 多线程操作样例
C# 多线程操作样例 using System; using System.Threading; //引用多线程namespace ThreadTest {public class Alpha{pub ...
最新文章
- 最新Java培训-NIO实战教程
- 32M内存 跑linux内核,32位Linux单进程4G内存限制
- 400W的TVS型号大全
- java 主备切换_keepalived 实现 Java 服务的高可用(主备切换)
- javascript xml转json
- ITU-T G.1080 IPTV的体验质量(QoE)要求 (Quality of experience requirements for IPTV services)
- 使用 SQL Server 代理来计划 SSAS 管理任务
- VTM3.0代码阅读:xCheckRDCostMerge2Nx2N函数
- 一个很难的sql面试题
- vi设计清单_最终产品设计组合清单
- 软件耦合的分类及解决方法
- 【整理】详解Python中re.sub
- vscode设置默认浏览器
- 使用Android 原生 API获取经纬度并且根据经纬度解析出当前具体位置信息
- galaxy s6 android8,这些三星机型确认可以升级Android 8.0
- Fedora Core 6 服务详解
- C++常成员函数 常对象成员
- OSChina 周四乱弹 ——国庆第五天
- 腾讯Oceanus实时计算平台架构设计---学习总结
- 测试下网站收录的问题
热门文章
- 分析攻击IP来源地并画出饼图
- vue2.x 在引用插件的时候,npm run dev跑正常 ,npm run build 报错vue-cli Unexpected token: punc (() [...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
- Android实现连续并排的若干个TextView单击改变背景颜色达到选项卡Tab栏切换效果...
- 一款net平台软件之汉化
- Request.ServerVariables 参数大全
- C#中类的继承问题04
- Angularjs 中的 controller
- SQL 关于地图两个坐标点之间的距离运算
- Java条件查询分页——总结