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

Posix.h

Posix应该把它当成一个父类,写一个子类继承他,并重写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;
}

上面是Posix父类的定义与实现,下面我们写一个新的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); //设置线程数为10mytest->Run();return 0;
}

执行结果:

下面是有关线程锁的介绍。

在线程执行时,所有的线程是并发执行的,我们不希望线程之间抢占同一资源,如多个线程对同一个FILE指针进行写操作,这样会出现莫名其妙的问题,这时我们就要使用线程锁,所以在main.cpp中我们用pthreadMutexInit()方法来初始化一下线程锁

#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;
}

同样的,在每个线程执行的过程当中,当进行到某个步骤的时候,我们也可以为其设置加锁和解锁,例如所有线程需要对一个成员变量进行操作时,我们可以在其操作之前加锁,操作完成后解锁。

#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; //打印线程IDthis->pthreadMutexUnlock();  //解锁线程}
};#endif /* TEST_H_ */

最后编译时别忘了添加编译选项: -lpthread

转载于:https://blog.51cto.com/xzx951753/1716088

C/C++ pthread 线程库的封装相关推荐

  1. pthread线程库使用介绍

    多线程的开发和应用在平时的项目中使用非常频繁.Linux C++中,一般使用pthread库操作线程相关业务,不少公司一般都会基于该线程库的基本接口进行封装,使用起来更加方便易用.本文对该线程库的常用 ...

  2. Linux系统编程36:多线程之线程控制之pthread线程库(线程创建,终止,等待和分离)

    文章目录 (1)POSIX线程库 (2)pthread_create--创建线程 A:关于Linux线程的再理解 B:线程ID及地址空间布局 (3)pthread_exit--线程终止 (4)pthr ...

  3. C++11学习笔记-----线程库std::thread

    在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...

  4. [并发并行]_[线程模型]_[Pthread线程使用模型之一管道Pipeline]

    场景 1.经常在Windows, MacOSX 开发C多线程程序的时候, 经常需要和线程打交道, 如果开发人员的数量不多时, 同时掌握Win32和pthread线程 并不是容易的事情, 而且使用Win ...

  5. linux 线程库在哪里,linux线程库

    简单地讲,进程是资源管理的最小单位,线程是程序执行的最小单位.一个进程至少要一个线程作为它的指令执行体,进程管理着资源(比如CPU,内存,文件等),而将线程分配到某个CPU上执行.一个进程当然可以拥有 ...

  6. C++中的lambda表达式和线程库

    98中的一个例子 如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法 #include <algorithm> #include <functional> ...

  7. Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

    对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...

  8. State Threads 回调终结者(ST线程库)

    本文转自: http://coolshell.cn/articles/12012.html 上回写了篇<一个"蝇量级"C语言协程库>,推荐了一下Protothreads ...

  9. Linux多线程编程:pthread线程创建、退出、回收、分离、取消

    文章目录 Linux线程 1.简单了解一下线程 2.线程创建:pthread_create 3.线程传参注意事项 4.线程退出:pthread_exit 5.线程回收:pthread_join 6.线 ...

最新文章

  1. 切换JAVAC的方法
  2. Java Socket多线程异步通信
  3. 关于appstore多语言版本,不可不看!
  4. Linux 下修改hosts文件
  5. centos 对已有卷扩容_centos LVM扩容 添加磁盘
  6. 前端工程化:围绕Jenkins打造工作流的过程
  7. oracle数据库编程实验2答案,Oracle数据库-作业2-答案
  8. Facebook究竟是怎么抄袭Snapchat的?听听他们自己怎么说
  9. WIN7下java环境的搭建
  10. dell vfoglight
  11. View#post与Handler#post的区别,以及导致的内存泄漏分析
  12. linux chmod详解
  13. 搜索引擎为什么不收录原创文章
  14. 加密流量分类任务的深度学习方法(一般框架总结)
  15. 基于4G路由器的救护车联网方案:生命,刻不容缓
  16. 老A:什么是抖音弹幕互动游戏,玩法以及如何参与
  17. Dojo.Book中文版
  18. 什么样的资金盘能活一年,还上了热搜?
  19. JavaScript 中的数字在计算机内存中占多少个Byte?
  20. 1688图片搜索API接口

热门文章

  1. centos7安装samba
  2. 日期格式转换:String 与 date
  3. mysql 事务 数量_MySQL 数据查询语言(DQL) 事务控制语言(TCL)详解
  4. 10054 java,为什么Socket.Receive在远程主机断开连接时抛出SocketException(10054)?
  5. template标签_C++核心准则T.65:使用标签分发提供函数的不同实现
  6. Linux E325: ATTENTION Found a swap file by the name “./.backu.sh.swp“
  7. 2020年中国在线少儿英语培训市场研究报告
  8. const与static的区别
  9. cad2008加载 et拓展工具_生物信息工具 | 如何为网络图添加漂亮的图例?
  10. 大数据时代网络安全必读