程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C/C++ pthread 線程庫的封裝

C/C++ pthread 線程庫的封裝

編輯:關於C++
經常沒事寫一些服務器壓力測試的工具,如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); //設置線程數為10
    mytest->Run();
    return 0;
}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved