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

经常没事写一些服务器压力测试的工具,如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

时间: 2024-10-01 07:47:55

C/C++ Posix线程库的封装的相关文章

Linux posix线程库总结

由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 目前,pthreads的实现有3种方式: (1)第一,多对一,也就是库实现. (2)第二种,1:1模式. 1:1模式适合CPU密集型的机器.我们知道,进程(线程)在运行中会由于等待某种资源而阻塞,可能是I/O资源,也可能是CPU.在多CPU机器上1:1模式是个很不错的选择.因此1:1的优点就是,能够充分发挥SMP的优势. 这种模式也有它的缺

POSIX线程库复习

创建一个新的线程 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,                           void *(*start_routine) (void *), void *arg); thread:返回线程ID attr:设置线程的属性,attr为NULL表示使用默认属性. start_toutine:是个函数地址,线程启动后要执行的函数 arg:传给线程启动函数的参数.   成功返回0,

Posix线程编程指南(3)

Posix线程编程指南(3) 杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/ 线程同步 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第三篇将向您讲述线程同步. 1 互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thr

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

POSIX线程(1)

POSIX线程库: 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以"pthread_"打头的 要使用这些函数库,要通过引入头文<pthread.h> 链接这些线程函数库时要使用编译器命令的"-lpthread"选项 pthread_create函数 功能:创建一个新的线程 原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_r

POSIX线程(2)

线程属性 初始化与销毁属性 int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr); 获取与设置分离属性 int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); int pthread_attr_setdetachstate(pthread_attr_t *attr,

Posix线程编程指南(1)

Posix线程编程指南(1) 作者:杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part1/ 线程创建与取消 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第一篇将向您讲述线程的创建与取消. 1 线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有

Posix线程编程指南(5)

Posix线程编程指南(5) 杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part5/ 杂项 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第五篇将向您讲述pthread_self().pthread_equal()和pthread_once()等杂项函数. 在Posix线程规范中还有几个辅助函数难以归类,暂且称其为杂项函数,主要包

Posix线程编程指南(4)

Posix线程编程指南(4) 杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part4/ 线程终止 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第四篇将向您讲述线程中止. 线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退