c++封装多线程类

原创 2015年11月18日 14:19:19

编程实例:

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::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 T : public Runnable
{
public:
    T() { d = 0;}
    virtual ~T(){d=0;}
	void* Run(void * arg);
private:
	T(const T& t);
	T& operator=(const T& t);
	int d;
};

void* T::Run(void* arg)
{
	do
	{
		++d;
	} while (d < 1000);
	std::cout << d <<"\n";
}

测试文件:
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);
    return 0;
}

编译:

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


相关文章推荐

C++多线程编程(线程类)

简述通过线程类来管理线程,实现业务逻辑与线程管理分离源代码接口类 SFRunnable.hclass SFRunnable { public: virtual ~SFRunna...

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

1.封装遇到的问题 将pthread线程封装为抽象类,这样用户在使用线程时,只需要继承一下这个抽象类,并实现相应的接口就可以了。这样做的好处是 用户可以将注意力集中在线程所要执行的逻辑上,而不需要关注...

C++使用thread类多线程编程

C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include #include #include using namespace std; void thread...
  • dcrmg
  • dcrmg
  • 2016年12月28日 20:23
  • 7169

c++多线程编程

一直对多线程编程这一块很陌生,决定花一点时间整理一下。 os:ubuntu 10.04  c++ 1.最基础,进程同时创建5个线程,各自调用同一个函数 #include #include ...

C++ 在类里面使用多线程技术

前言有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是熟悉C++对象语法的人应该知道,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为...
  • jmh1996
  • jmh1996
  • 2017年05月16日 07:24
  • 1196

c++11 thread 封装线程类

c++ thread也挺好用的,也可以像qt thread那样,start启动,run函数为线程的实际运行代码。thread和this_thread方法不多,常用的就几个。 1.std::t...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++中面向对象和基于对象的线程封装方法

原文链接:http://blog.chinaunix.net/uid-26611383-id-4273854.html

c++封装多线程2

编程实例: CThread.h #include #include #include #include class Runnable { public: virtual ~Run...

C++ 用类封装 pthread

一个项目中需要用到pthread,发现把它封装到类中使用起来更加的方便。 这里保存了实例代码,以备以后使用。 头文件中定义了ThreadBase类,它包含了线程基本的一些接口,start()  j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++封装多线程类
举报原因:
原因补充:

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