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++_p2p实现多线程文件传输

  • 2012年05月06日 12:03
  • 1.51MB
  • 下载

cocos2d-x 中多线程的c/c++代码通过JNI调用java代码

Cocos2dx 的多线程c/c++通过JNI调用java的代码
  • wu4long
  • wu4long
  • 2014年01月02日 15:49
  • 3574

cocos2d-x 中多线程的c/c++代码通过JNI调用java代码

2014-01-02 15:49 1923人阅读 转载请注明原地址: http://blog.csdn.net/wu4long/article/details/17757433 这个文章为an...
  • dj0379
  • dj0379
  • 2015年08月11日 15:18
  • 652

《c/c++商用工程之道》代码实现之2_锁_多线程安全的变量

6.2  锁对象  p225 #ifdef WIN32 #include #define MUTEX CRITICAL_SECTION #define MUTEXINIT(m) ...

对libevent+多线程服务器模型的C++封装类

最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢迎大家试用。 这个类的使...

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

http://blog.csdn.net/flyingleo1981/article/details/51862857 最近在看memcached的源码,觉得它那种libevent+...

对libevent+多线程服务器模型的C++封装类 转载

原文:http://www.tuicool.com/articles/QBj2ma 最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型真的很不错,我将这...
  • senkkes
  • senkkes
  • 2016年10月13日 20:21
  • 397

在window下的Mysql基本操作以接口的方式封装并提供出来,C++多线程操作

最近刚刚需要同时用到mysql和多线程,网上mysql和多线程的教程很多,但是能同时使用的资料没找到,不过通过网上的这些的资料,写了个demo来理解和理顺自己这几天的学习,分享一下。 Mysql...
  • catemo
  • catemo
  • 2016年11月07日 13:24
  • 437

linux下的c++ 多线程封装

最近为了学习linux 下的多线程,自己用c++封装了一个简易的局域网多线程聊天服务器,期间遇到了一些坑写到这里与大家共勉! 主要功能: 封装了一个名叫pthread_serv的类对每一个客户端的响...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++封装多线程2
举报原因:
原因补充:

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