码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++ Posix线程库的封装

时间:2015-11-23 19:09:59      阅读:675      评论:0      收藏:0      [点我收藏+]

标签:pthread   多线程   posix   c++   c语言   封装   

经常没事写一些服务器压力测试的工具,如http,mysql,等。说到压力测试,首先想到的应该就是多线程,研究过一段时间的pthread,包括线程锁,在这里发一个自己写的Posix封装.


Posix.h

该类作为一个父类,应写一个子类继承他,并重写action方法,action()为所有线程所执行的内容,最后使用Run()开始执行所有线程。

#ifndef POSIX_H_
#define POSIX_H_

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

using namespace std;


class Posix {
public:
	Posix();
	int getThreadNumber(void);  //获取线程数
	int pthreadMutexInit(void);  //初始化线程锁,如果不希望使用锁可以不用,有关锁的更多,在后面介绍
	int pthreadMutexLock(void);  //加锁
	int pthreadMutexUnlock(void); //解锁
	int pthreadMutexDestroy(void); //销毁锁
	void setThreadNumber(int threadNumber); //设置开启的线程数
	void Run();                    //所有线程开始执行
	virtual void action()=0;        //每个线程执行的内容,在子类中重写
protected:
	/*线程数*/
	int _threadNumber;
	/*线程锁*/
	pthread_mutex_t _mutex;
};

#endif /* POSIX_H_ */



Posix.cpp

因为pthread_create()函数只接收函数指针,不接受C++成员函数,所以另外创建静态函数actionRun()作为桥接。

#include "Posix.h"

Posix::Posix(){
	//初始化线程数为8
	_threadNumber = 8;
}

static void* actionRun(void* parm){
	Posix* pt = (Posix*)parm;
	pt->action();    //执行子类重写的虚函数
	return NULL;
}

/*线程锁初始化函数*/
int Posix::pthreadMutexInit(void){
	return pthread_mutex_init(&this->_mutex,NULL);
}

/*线程加锁*/
int Posix::pthreadMutexLock(void){
	return pthread_mutex_lock(&this->_mutex);
}

/*线程解锁*/
int Posix::pthreadMutexUnlock(void){
	return pthread_mutex_unlock(&this->_mutex);
}

/*销毁锁*/
int Posix::pthreadMutexDestroy(void){
	return pthread_mutex_destroy(&this->_mutex);
}

int Posix::getThreadNumber(void){
	return this->_threadNumber;
}
void Posix::setThreadNumber(int threadNumber){
	this->_threadNumber = threadNumber;
}

void Posix::Run(){
	pthread_t pthread[this->_threadNumber]; //线程数组
	for ( int count = 1 ; count <= this->_threadNumber ; count++ ){ //开始创建线程
	                            
	//在此,因为pthread_create的第三个参数只接收函数指针,C++成员函数不能进行传递,所以创建actionRun为普通的静态函数,作为桥接,具体实现请往上看actionRun();
		if ( pthread_create( &pthread[count] , NULL , actionRun , this) != 0 ){
			cerr << "线程创建失败,线程号 = " << count <<endl;
		}
	}
	for ( int count = 1 ; count <= this->_threadNumber ; count++ ){
		if ( pthread_join( pthread[count], NULL ) != 0 ){
			cerr << "线程执行失败,线程号 = " << count << endl;
		}
	}
//	cout << "线程执行完成!" << endl;
}


下面是一个test类来继承Posix类

test.h

重写父类action()函数,打印线程ID

#ifndef TEST_H_
#define TEST_H_

#include "Posix.h"

class test : public Posix {
public:
    action(){
        cout << pthread_self() << endl; //打印线程ID
    }
}

#endif /* TEST_H_ */


下面是main.cpp

#include "test.h"
int main(void){
	test* mytest = new test();
	
	mytest->setThreadNumber(10); //设置线程数为10
	mytest->Run();
	return 0;
}

执行结果:

技术分享


如需使用线程锁(有时候线程执行中,我们不希望线程之间抢占资源,如多个线程对同一个FILE指针进行写操作,就要使用线程锁),可以这么写main.cpp , test类也稍作修改

#include <iostream>
#include "test.h"

using namespace std;

int main(void){
	test* mytest = new test();
	mytest->pthreadMutexInit(); //初始化锁
	mytest->setThreadNumber(10);
	mytest->Run();
        mytest->pthreadMutexDestroy(); //销毁锁
	return 0;
}


test.h

#ifndef TEST_H_
#define TEST_H_

#include "Posix.h"

class test : public Posix {
public:
	test();
	virtual ~test();
	void action(){
		this->pthreadMutexLock();    //锁住线程,形成队列,先到的先执行
		cout << pthread_self() << endl; //打印线程ID
		this->pthreadMutexUnlock();  //解锁线程
	}
};

#endif /* TEST_H_ */


编译时添加编译选项: -lpthread

本文出自 “C/C++技术专题” 博客,请务必保留此出处http://xzx951753.blog.51cto.com/3231458/1716088

C/C++ Posix线程库的封装

标签:pthread   多线程   posix   c++   c语言   封装   

原文地址:http://xzx951753.blog.51cto.com/3231458/1716088

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!