zoukankan      html  css  js  c++  java
  • 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来实现,这就是基于对象的编程风格。

  • 相关阅读:
    ZOJ3209 Treasure Map —— Danc Links 精确覆盖
    HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题
    FZU1686 神龙的难题 —— Dancing Links 可重复覆盖
    POJ3074 Sudoku —— Dancing Links 精确覆盖
    HDU3085 Nightmare Ⅱ —— 双向BFS + 曼哈顿距离
    HDU3533 Escape —— BFS / A*算法 + 预处理
    HDU3567 Eight II —— IDA*算法
    HDU1560 DNA sequence —— IDA*算法
    FZU2150 Fire Game —— BFS
    POJ3087 Shuffle'm Up —— 打表找规律 / map判重
  • 原文地址:https://www.cnblogs.com/xieweikai/p/6817668.html
Copyright © 2011-2022 走看看