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++封装线程类

/** \file * Thread.h,定义线程创建和停止接口,通过内联函数提供给其它模块使用 * * \author Fzuim * * 版本历史 * \par 2014-7-7 * * * ...
  • fzuim
  • fzuim
  • 2017年04月10日 16:05
  • 341

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

原文链接:http://blog.chinaunix.net/uid-26611383-id-4273854.html
  • yuanhubilie
  • yuanhubilie
  • 2014年07月11日 11:11
  • 1767

C++线程锁封装

C++线程锁的封装,主要提供lock,unlock,require等操作,需要注意的是线程重复获取锁的问题,设置了一个count的计数器,该计算器之所以不考虑++,--的原子操作的问题,是因为该计数器...
  • turkeyzhou
  • turkeyzhou
  • 2013年02月22日 18:20
  • 2241

C++ 线程池的封装实现

为了充分利用多核的优势,我们利用多线程来进行任务处理,但线程也同样不能滥用,会带来一下几个问题: 1)线程本身存在开销,系统必须为每个线程分配如栈,TLS(线程局部存储),寄存器等。 2)线程管理...
  • turkeyzhou
  • turkeyzhou
  • 2013年04月03日 14:57
  • 31802

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

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

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

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

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

简述通过线程类来管理线程,实现业务逻辑与线程管理分离源代码接口类 SFRunnable.hclass SFRunnable { public: virtual ~SFRunna...
  • csx66406602
  • csx66406602
  • 2017年02月04日 16:06
  • 1152

c++多线程编程

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

当线程函数为C++类成员函数时

很多时候我们在C++多线程开发时,都会或多或少遇到线程函数为C++类中的某个成员函数,此时可能会发生什么呢?你有可能会杂么做呢? 接下来我就为大家总结一下我在这方面走过的一个历程1.问题一记得我在之...
  • Shreck66
  • Shreck66
  • 2015年12月26日 20:03
  • 7369

c++多线程(四)

线程间通信 主线程创建子线程必定会为主线程分担一部分工作,这样不可避免的会在这两个线程之间存在消息传递渠道,因此主线程和子线程之间要进行通信。        下面介绍几种通信方式: 全局...
  • richerg85
  • richerg85
  • 2012年04月11日 23:23
  • 6897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++封装多线程类
举报原因:
原因补充:

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