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++ 在类里面使用多线程技术

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

C++类中定义线程

1. C++ 中如何定义线程函数      有两种方法:a. 定义线程函数为全局函数    b. 定义线程函数为类的静态成员函数 2. C++中的线程函数如何访问类中的成员变量     针...
  • guomsh
  • guomsh
  • 2013-08-27 10:33
  • 6145

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

C++ 封装的多线程类

在JAVA中,实现多线程有两种方式,一种是继承自Thread类,一种是Runnable,在MFC中也有CWinThread类,但是我们如何利用已有的多线程的机制来实现一个多线程类呢? 在Wind...

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

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

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

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

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

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

c++封装多线程类

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

c++封装多线程2

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

C++封装线程类

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

c++封装线程

线程库类型 Linux线程库有两个流行的线程库,分别是LinuxThreads和NPTL,由于LinuxThreads的某些缺点,已经被NPTL取代,它们都是基于1:1模式实现,即1个用户线程被...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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