专栏首页我有一个梦想C++服务器开发之基于对象的编程风格

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来实现,这就是基于对象的编程风格。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UE4中的单映射:TMap容器

    一、TMap<T>是么 TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每...

    用户1198337
  • boost::function的用法

    本片文章主要介绍boost::function的用法。 boost::function 就是一个函数的包装器(function wrapper),用来定义函数对...

    用户1198337
  • Qt中纯C++项目发布为dll的方法(超详细步骤)

    目录 一般创建方法 导出普通函数的方法&调用方法 导出类及其成员函数的方法&调用方法 众所周知,我们可以将C++项目中的类以及函数导出,形成 .dll 文件,以...

    用户1198337
  • 面向对象编程风格 VS 基于对象编程风格(boost::bind/function)

    本文主要通过实现Thread 类来展现两种编程风格的不同点。 很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺...

    s1mba
  • 过来人的经验,谈谈一致性处理方案—分布式事务(DTS)

    传统事务是使用数据库自身的事务属性(ACID),而数据库自身的事务属性是局限于当前实例,不能实现跨库。而对于大型分布式/微服务集群系统中,不仅存在着跨库的事务,...

    用户2991389
  • QT学习第6天:画板制作(实现在图片上上绘制图像和橡皮擦功能)

    链接:https://pan.baidu.com/s/11RKURSpVJIb8NTPyFgPCYw 提取码:0818

    cuptobjut
  • 多线程中的锁系统(一)-基础用法

    蘑菇先生
  • 一份走心的iOS开发规范前言约定(一)命名规范(二)编码规范2.14 内存管理规范本文参考文章其他有价值的文章

    VV木公子
  • KVM usb passthrough配置

    宿主机1 centos 6.6 64位 内核版本 2.6.32-431.1.2.0.1.el6.x86_64

    力哥聊运维与云计算
  • libvirt-usb设备透传给虚拟机

    在虚拟化实践过程中把物理机上的usb设备透传给虚拟机直接使用时很常见的应用场景,尤其时一些usb加密key的的透传使用,本文简单介绍一下usb设备透传的...

    虚拟化云计算

扫码关注云+社区

领取腾讯云代金券