C++服务器开发之基于对象的编程风格

Thread.h
#ifndef _THREAD_H_
#define _THREAD_H_

#include <pthread.h>
#include <boost/function.hpp>

class Thread
{
public:
	typedef boost::function<void ()> ThreadFunc;
	explicit Thread(const ThreadFunc& func);

	void Start();
	void Join();

	void SetAutoDelete(bool autoDelete);

private:
	static void* ThreadRoutine(void* arg);
	void Run();
	ThreadFunc func_;
	pthread_t threadId_;
	bool autoDelete_;
};

#endif // _THREAD_H_

Thread.cpp

#include "Thread.h"
#include <iostream>
using namespace std;

Thread::Thread(const ThreadFunc& func) : func_(func), autoDelete_(false)
{
}

void Thread::Start()
{
	pthread_create(&threadId_, NULL, ThreadRoutine, this);
}

void Thread::Join()
{
	pthread_join(threadId_, NULL);
}

void* Thread::ThreadRoutine(void* arg)
{
	Thread* thread = static_cast<Thread*>(arg);
	thread->Run();
	if (thread->autoDelete_)
		delete thread;
	return NULL;
}

void Thread::SetAutoDelete(bool autoDelete)
{
	autoDelete_ = autoDelete;
}

void Thread::Run()
{
	func_();
}

Thread_Test.cpp

#include "Thread.h"
#include <boost/bind.hpp>
#include <unistd.h>
#include <iostream>
using namespace std;

class Foo
{
public:
	Foo(int count) : count_(count)
	{
	}

	void MemberFun()
	{
		while (count_--)
		{
			cout<<"this is a test ..."<<endl;
			sleep(1);
		}
	}

	void MemberFun2(int x)
	{
		while (count_--)
		{
			cout<<"x="<<x<<" this is a test2 ..."<<endl;
			sleep(1);
		}
	}

	int count_;
};

void ThreadFunc()
{
	cout<<"ThreadFunc ..."<<endl;
}

void ThreadFunc2(int count)
{
	while (count--)
	{
		cout<<"ThreadFunc2 ..."<<endl;
		sleep(1);
	}
}

int main(void)
{
	Thread t1(ThreadFunc);
	Thread t2(boost::bind(ThreadFunc2, 3));
	Foo foo(3);
	Thread t3(boost::bind(&Foo::MemberFun, &foo));
	Foo foo2(3);
	Thread t4(boost::bind(&Foo::MemberFun2, &foo2, 1000));

	t1.Start();
	t2.Start();
	t3.Start();
	t4.Start();

	t1.Join();
	t2.Join();
	t3.Join();
	t4.Join();

	return 0;
}

不采用面向对象的编程风格,使用boost bind/function来实现,这就是基于对象的编程风格。

时间: 2024-10-26 15:41:08

C++服务器开发之基于对象的编程风格的相关文章

基于对象的编程

对象就是类的实例. 一个类与自身具有同样名称的成员函数叫做构造函数. 没有參数的构造函数称为默认构造函数. 双冒号::是作用域操作符. 函数重载:同样函数名称能够用不同形式參数定义多次. 參数是通过值进行传递的. 内联函数:减小开销,添加效率. ///环境变量/// #include<iostream> #include<stdlib.h> using namespace std; char * uname = getenv("PATH");///获得命令路径

简单服务器开发(三)Socket 编程

Socket 的英文原义是“孔”或“插座”.通常也称作"套接字",用于描述 IP 地址和端口,可以用来实现不同计算机之间的通信.在 Internet 上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认.第一步:服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,

NodeJS的异步编程风格

NodeJS的异步编程风格 http://www.infoq.com/cn/news/2011/09/nodejs-async-code NodeJS运行环境因其支持Javascript语言和异步编程受到开发社区越来越多的关注.从GitHub上的访问量来看,NodeJS项目的关注度在最近几个月已经超过了Ruby及RoR.作为一个新鲜的平台,开发人员开始尝试去接触并运用于实际工作中,比如LinkedIn.Yammer.GitHub.淘宝等企业已经在生产环境中部署了NodeJS应用.不过,在学习No

[转载]NodeJS的异步编程风格

NodeJS运行环境因其支持Javascript语言和异步编程受到开发社区越来越多的关注.从GitHub上的访问量来看,NodeJS项目的关注度在最近几个月已经超过了Ruby及RoR.作为一个新鲜的平台,开发人员开始尝试去接触并运用于实际工作中,比如LinkedIn.Yammer.GitHub.淘宝等企业已经在生产环境中部署了NodeJS应用.不过,在学习NodeJS的过程中,从同步编程到异步编程风格的转换是开发人员面临的一个主要问题,我们如何去适应呢?技术社区在讨论这种转变,专家Marc Fa

基于Java的高性能基金持仓分析服务器开发

基于Java的高性能基金持仓分析服务器开发(Java多线程\SOCKET编程\JAVA高并发) http://www.ibeifeng.com/goods-260.html 咨询QQ2110053820 课程讲师:hejing 课程分类:Java基础 适合人群:中级 课时数量:30课时 更新程度:完毕 用到技术:Java多线程.SOCKET编程.ant编译.poi组件 涉及项目:基金持仓分析服务器 本课程是一套采用JAVA开发大并发.高性能服务器系统的视频教程,此教程从头到 尾采用高性能基金持仓

Apache Solr采用Java开发、基于Lucene的全文搜索服务器

http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Lucene的全文搜索服务器,文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过 http收到一个XML/JSON响应来实现.Solr 中存储的资源是以 Document 为对象进行存储的.每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性.Solr 中的每个 Doc

Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesaw发布的博客中这样写道:“我们需要能够处理单播(unicast)和任播(anycast)虚拟 IP (VIPs) 流量,使用 NAT 和 DSR (也被称为 DR) 执行负载均衡,执行针对后端的健康检查.特别是,我们需要一个容易管理的平台,可以自动部署配置的变化.在评估了一些包括现有的开源项目的平台

基于对象编程与面向对象编程(表达式计算器3)

基于对象编程与面向对象编程 我们的最终目的是用C++设计一个面向对象的表达式计算器,所以非常有必要弄清楚,什么是基于对象编程和面向对象的编程.而要弄清楚这一点,又要先弄明白什么是值语言,什么是对象语义 值语义:对象的拷贝与原对象无关,拷贝后与原对象脱离关系,互不影响.这种拷贝叫深拷贝.拷贝之后脱离关系,只要在拷贝的时候都为对象分配内存空间就行了.某种些情况下算是一种对资源的浪费 值语义例子 class Test { private: int * pNum_; public: Test(int n

C++学习之路: 线程封装(基于对象编程)

引言: 此次我们重新封装线程, 采用基于对象编程的方式,不用于面向对象编程中重定义虚函数的方式,这里我们用回调函数的方式. Thread.h 1 #ifndef THREAD_H_ 2 #define THREAD_H_ 3 4 #include <boost/noncopyable.hpp> 5 #include <functional> 6 #include <pthread.h> 7 8 class Thread : boost::noncopyable 9 {