- 浏览: 2036415 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
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结合起来使用。
发表评论
-
Berkeley DB 使用经验总结
2012-08-27 14:41 3086作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1533前言 UNIX/LINUX平台下的数据库种类非常多 ... -
C语言中标准输入流、标准输出流、标准错误输出流
2011-06-13 14:32 9293C语言中标准输入流、标准输出流、标准错误输出流 在 ... -
Rsync 实现原理
2011-05-12 20:06 8319Rsync 实现原理 前言 关于rsync的原始文档 ... -
c++简单的虚函数测试
2011-04-27 14:25 1020#include <iostream> u ... -
C++文件行查找
2011-04-26 14:10 1408#include <iostream> # ... -
c++偏特化简单示例
2011-04-13 11:17 2156c++偏特化 // temp1.c ... -
GDB调试精粹及使用实例
2011-03-16 14:06 1141GDB调试精粹及使用实例 一:列文件清单 1. ... -
简单的ini文件解析
2011-02-12 16:36 1623int GetKeyVal(const string s ... -
scanf族函数高级用法
2011-01-25 16:00 2562如何解释 fscanf(fd,&quo ... -
使用scons替代makefile(1)
2011-01-25 11:58 3733早在多年前我刚开始接触linux下的C程序时,经常被makef ... -
使用scons替代makefile(2)
2011-01-25 11:57 3584本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态 ... -
使用scons替代makefile(3)
2011-01-25 11:55 4821在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序 ... -
C 支持动态添加测试数据的测试代码
2011-01-13 17:22 1120/下面的定义为了支持可扩增。 //当需要增加一个新的测试用列 ... -
Linux下Makefile的automake生成
2010-12-28 16:55 1102******************helloworld.c* ... -
SCons笔记(详细版)
2010-12-23 16:11 105411. 基本使用 SConstruct文件就功能而言相当于Ma ... -
scons 学习
2010-12-23 11:14 2181scons 学习 作者:Sam(甄峰) sam_code@h ... -
scons随笔
2010-12-22 20:20 4707scons随笔 Scons是新一代的软件构件工具,或者说ma ... -
Scons在linux下的安装和使用
2010-12-21 11:59 3286因为正在用的一个开源软件需要的Developm ... -
排列组合的实现
2010-12-20 12:41 1063简单算法: 从前往后(或者从后往前)每次交换一个位置。当存在 ...
相关推荐
- **`boost::thread`类**:负责启动和管理单个线程的生命周期,提供线程创建、启动、等待和终止等功能。 - **`this_thread`命名空间**:提供了当前线程的实用工具函数,如`get_id()`用于获取当前线程的ID。 - **`...
1. **线程创建与管理**:`boost::thread`类是 Boost 线程库的核心,可以用来创建和管理线程。你可以通过传递一个可调用对象(如函数、函数指针或成员函数)来启动一个新的线程。 2. **线程同步**:Boost线程库提供...
接下来,我们可以通过创建一个简单的项目来了解Boost线程库的基本用法。"thread.sln"和"thread.suo"文件分别代表解决方案文件和解决方案用户选项文件,它们记录了项目的配置信息。在VS2010中打开这些文件,我们可以...
以下是对Boost线程池源代码文档的详细解析: 1. **线程池原理**: - 线程池的基本思想是维护一个工作线程的集合,当有新的任务提交时,线程池会从可用线程中选择一个执行任务,而不是每次都创建新线程。这样可以...
线程池的核心思想是维护一组后台工作线程,当有新任务需要执行时,而不是每次都创建新的线程,而是从线程池中获取已存在的线程来执行任务,从而减少了线程创建和销毁的开销。 Boost线程池的实现基于Boost.Thread库...
在Boost.Thread库中,你可以创建、管理并同步线程。它包括各种同步原语,如条件变量、信号量、事件和我们这里重点关注的互斥锁。 互斥锁(Mutex)是确保多线程安全的关键工具。在多线程环境中,当多个线程试图同时...
Boost.Thread库提供了`thread`类,可以用来创建和管理线程。为了确保线程安全,我们需要考虑锁机制,如互斥锁(`mutex`)和条件变量(`condition_variable`),以防止多个线程同时访问SQLite数据库导致的数据竞争...
总结起来,Boost线程库提供了丰富的多线程编程工具,包括线程创建、同步原语和线程管理,极大地简化了C++的多线程编程。在实际应用中,正确理解和使用这些工具对于编写高效、安全的并发程序至关重要。
Boost.Thread库提供了线程池的实现,它可以帮助开发者更好地管理线程,避免频繁创建和销毁线程的开销。线程池的工作原理是:当有新任务到来时,线程池会从空闲线程中选择一个来执行任务,而不是每次都创建新的线程。...
为了解决这一难题,Boost线程库应运而生,它不仅提供了跨平台的多线程解决方案,还充分利用了C++的高级特性,如构造函数、析构函数、函数对象和模板,以实现更安全、更灵活的线程管理。 #### 创建线程:利用Boost::...
本示例"boost asio异步多线程接收demo"主要探讨了如何利用Boost.Asio库实现异步多线程的网络通信,每个连接使用独立的线程和IO服务(`io_service`),以确保线程间的并行性和无干扰。 首先,我们需要理解`io_...
2. **Boost.Thread**:这个库提供了线程管理的功能,使得开发者能够轻松地创建和管理多线程。在本项目中,多线程用于并发下载,每个线程负责处理一个或多个文件的下载任务,从而提高了下载速度。 3. **HTTP协议**:...
这个示例代码创建了一个Boost线程对象,并将其传递给工作函数。在完成时退出该线程。这个简单的示例用于验证Boost线程库的安装是否成功。 本文指导初学者一步一步地安装和使用Boost库,包括下载和安装Boost库、配置...
然而,这只是个起点,实际开发中还需要熟悉Ogre的API,理解3D渲染原理,以及掌握Boost线程库的高级用法,才能充分发挥它们的潜力。同时,保持代码清晰和结构良好,以维护项目长期的可维护性和扩展性。
Boost线程池(ThreadPool)是这个库的一部分,它允许开发者有效地管理多个线程,避免频繁创建和销毁线程带来的开销。线程池的概念是预先创建一组线程,当有任务需要执行时,任务会被分配到空闲的线程,而不是每次都...
以下是一些关于C++线程创建和调用的关键知识点: 1. **线程创建**:在C++中,创建一个新线程可以通过`std::thread`类来实现。首先,定义一个函数,这个函数将在新线程中运行。例如,我们可以有一个名为`...
该文档详细阐述了如何使用Boost.Thread创建、同步和管理线程,包括线程安全的数据共享、条件变量、信号量、互斥量等机制,这些都是多线程编程的关键。 通过学习这个“Boost完美组合”,开发者不仅可以掌握Boost库的...
1. **线程创建与管理**:`boost::thread` 类型用于创建和管理线程。你可以通过构造函数传递一个可调用对象(如函数指针或lambda表达式)来启动新线程执行。 2. **线程同步**:Boost.Thread 提供了多种同步原语,如`...