c++封装多线程2

原创 2015年11月18日 16:53:54

编程实例:

CThread.h

#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <iostream>

class Runnable
{
public:
    virtual ~Runnable() {}
	virtual void* Run(void * arg) = 0;
};

class CThread
{
public:
    CThread();
    virtual ~CThread();
	void Start(Runnable *r, void* arg);
	void Stop();   
	int getpid() { return pid;}
	int getthreadid() {return tid;}
private:
	int CreateThread(pthread_t *threadid, void *pfunction, void *arg)
	{
		int ret = 0;
		pthread_attr_t attr;
		pthread_attr_init(&attr);
		{
			ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
			if(ret < 0)
			{
				pthread_attr_destroy(&attr);
				return ret;
			}
		}
		pthread_create(threadid, &attr, (void*(*)(void*))pfunction, arg);
		pthread_attr_destroy(&attr);

		return ret;
	}
	static void* hook(void *arg) //global function
	{
		CThread *thread = (CThread*)arg;
		thread->pid = gettid();
		if(thread->runnable)
		{
			thread->runnable->Run(arg);
		}
		return (void*)NULL;
	}
private:
	static pid_t gettid(){return syscall(__NR_gettid);}
    pthread_t tid; //thread id
	int pid; //process id
	void *data;
	Runnable *runnable;
	CThread(const CThread&);
	CThread& operator=(const CThread& );
};

CThread::CThread()
{
	tid = 0;
	pid = 0;
}

CThread::~CThread()
{}

void CThread::Start(Runnable *r, void* arg)
{
	runnable = r;
	data = arg;
	if(CreateThread(&tid, (void*)CThread::hook, (void*)this) < 0)
	{
		std::cout << "create pthread err\n";
	}
	else
	{
		std::cout << "pthread start:"<<tid << "\n";
	}
}

void CThread::Stop()
{
	if(tid)
	{
		pthread_join(tid, NULL);
		tid = 0; pid = 0;
	}
}

class CDefultRunnable : public Runnable
{
public:
	CDefultRunnable(){ threadcount = 1;} 
	CDefultRunnable(int num):threadcount(num){}
	~CDefultRunnable(){}

	void SetThreadsCount(int num)
	{
		if(threads != NULL)
		{
			std::cout << "threads is running, can't set thread count\n";
			return;
		}
		threadcount = num;
	}
	void Start();
	void Stop();
	void Wait();
private:
	int threadcount; //
	CThread* threads;
};

void CDefultRunnable::Start()
{
	threads = new CThread[threadcount];
	if(threads)
	{
		for(int i=0; i<threadcount; ++i)
		{
			threads[i].Start(this, (void*)i);
		}
	}
}
void CDefultRunnable::Stop()
{	
}
void CDefultRunnable::Wait()
{
	if(threads != NULL)
	{
		for(int i=0; i< threadcount; ++i)
		{
			threads[i].Stop();
		}
	}
}

class T : public CDefultRunnable
{
public:
    T()
	{
		pthread_mutex_init(&mutex, NULL);
		d = 0;
	}
	T(int num):CDefultRunnable(num)
	{
		pthread_mutex_init(&mutex, NULL);
		d = 0;
	}
    virtual ~T(){d=0;}
	void* Run(void * arg);
private:
	T(const T& t);
	T& operator=(const T& t);
	int d;
	pthread_mutex_t mutex;
};

void* T::Run(void* arg)
{
	do
	{
		pthread_mutex_lock(&mutex);
		++d;		
		if(d > 1000) break;
		std::cout << d << "\n";
		pthread_mutex_unlock(&mutex);
	} while (d < 1000);
}

测试文件:

Test.cpp

#include "CThread.h"
#include <sys/time.h>
int main(int argc, char *argv[])
{
    // T t;
	// CThread *thread = new CThread();
	// thread->Start(&t, NULL);
	// std::cout << "OK\n";
	// thread->Stop();
	// sleep(1);
	// T t2;
	// thread->Start(&t2, NULL);
	// thread->Stop();
	// sleep(1);

	T *t = new T(5);
    //t->SetThreadsCount(5);
	t->Start();
	t->Stop();
	sleep(2);
    return 0;
}

编译:

g++ -o test Test.cpp CThread.h -lpthread

C++ 封装的多线程类

在JAVA中,实现多线程有两种方式,一种是继承自Thread类,一种是Runnable,在MFC中也有CWinThread类,但是我们如何利用已有的多线程的机制来实现一个多线程类呢? 在Wind...
  • netanimals
  • netanimals
  • 2011年08月03日 19:09
  • 4413

multi-reactor服务器模型的C++封装类(libevent+多线程实现)

最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型(multi-reactor)真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢...
  • flyingleo1981
  • flyingleo1981
  • 2016年07月08日 17:41
  • 1886

用C++简单封装了一下SQLite

SQLite 强大,大家都知道,但是原生是C接口,用来其应用层稍微麻烦些。 今天做了个简单的C++封装,使用面向对象的方法来使用。 优点:面向对象的方式,减少应用层的复杂性; 缺点:暂对多线程环...
  • lonelyforest
  • lonelyforest
  • 2012年07月01日 18:21
  • 1167

linux C++ 面向对象线程类(封装,继承,多态)

头文件Thread.h#ifndef _THREAD_H_ #define _THREAD_H_ #include //抽象类 class Thread { public: Thread();...
  • u011676589
  • u011676589
  • 2013年08月15日 09:19
  • 2603

mysql Connector C/C++ 多线程封装

在网上找了好久,有很多封装,但是感觉对多线程处理的不多,都不是很理想。封装完的第一个版本,想法比较简单,使用一个单例模式,对应一个连接,多线程查询的时候都是在这个链接上完成,如下简略代码 c...
  • educast
  • educast
  • 2013年11月05日 11:35
  • 1508

跨平台的线程封装类

#ifdef WIN32 #include #include #else #include #endif /* #ifdef WIN32 typedef unsigned int(__stdc...
  • peng314899581
  • peng314899581
  • 2016年07月29日 15:58
  • 938

c++类和类的封装,对象线程封装

c++类和类的封装,对象线程封装C++面向对象编程介绍 面向对象编程(Object Oriented Programming),简称OOP。 在传统的面向过程编程中,数据以及数据的相关操作函数都是分离...
  • h674174380
  • h674174380
  • 2017年07月30日 09:18
  • 508

封装C++实现Window和Linux下多线程Socket通信

参考文章:传送门 项目 Windows Linux 主要头文件 winsock.h/winsock2.h sys/socket.h fcntl.h  errno.h 链接库 ws2_3...
  • guo3165935
  • guo3165935
  • 2015年02月03日 11:03
  • 1015

c++11多线程模板

c++11多线程模板,可以在此基础上改进。 这个模板读取一个文件list,然后读取list中的每个文件,对每个文件做一些复杂的操作。...
  • ChangHongJian
  • ChangHongJian
  • 2016年11月08日 11:36
  • 500

linux C++ 面向对象线程类封装

1.封装遇到的问题 将pthread线程封装为抽象类,这样用户在使用线程时,只需要继承一下这个抽象类,并实现相应的接口就可以了。这样做的好处是 用户可以将注意力集中在线程所要执行的逻辑上,而不需要关注...
  • maotoula
  • maotoula
  • 2016年11月25日 17:01
  • 10711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++封装多线程2
举报原因:
原因补充:

(最多只允许输入30个字)