标签: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
标签:pthread 多线程 posix c++ c语言 封装
原文地址:http://xzx951753.blog.51cto.com/3231458/1716088