C++ 在類裏面使用多線程技術

有不少時候,咱們但願能夠在C++類裏面對那些比較耗時的函數使用多線程技術,可是,C++類的成員函數的函數指針不能直接作爲參數傳到pthread_create,主要由於是C++成員函數指針帶有類命名空間,同時成員函數末尾是會被C++編譯器加上能夠接收對象地址的this指針參數。所以須要將成員函數作必定的轉化,將其轉化爲不被編譯器加上this指針,而由咱們本身來爲該函數維護」this」指針便可。ios

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
class Test
{
    public:
        int sum;
        int cnt;
    Test(){sum=0;}
    public:
        int insert();
        void * insert_pth(void*);
        void lanch();
};
int Test::insert()
{
    sleep(2);
    sum+=1;
}
void * Test::insert_pth(void*)
{
    insert();
}
void Test::lanch()
{
    pthread_t pth;
    pthread_create(&pth,NULL,insert_pth,NULL);
}
int main()
{
    Test t;
    t.lanch();
    return 0;
}

只需將insert_pth變化爲static函數,同時將insert邏輯代碼轉移到insert_pth便可:多線程

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
class Test
{
    public:
        int sum;
        int cnt;
    Test(){sum=0;}
    public:
        int insert();
    static  void * insert_pth(void*);
        void lanch();
};
int Test::insert()
{
    sleep(2);
    sum+=1;
    printf("%d insert.....\n",sum);
}
void * Test::insert_pth(void* __this)
{
    Test * _this =(Test *)__this;
    sleep(2);
    _this->sum+=1;
    printf("%d insert.....\n",_this->sum);
}
void Test::lanch()
{
    pthread_t pth;
    pthread_create(&pth,NULL,insert_pth,(void*)this);
}
int main()
{
    Test t;
    t.sum=0;
    t.lanch();
    sleep(5);
    return 0;
}

注意:函數

在 XXX_pth()函數內容儘可能不要調用類的其它成員函數,不然成員函數將沒法獲取正確的this指針而操做錯誤內存,從而致使segmantation faultthis

總結:spa

  • 將線程函數聲明爲靜態函數;
  • 建立線程時傳遞進去this指針;
  • 在線程函數中使用傳進來的this指針調用類的成員,特別注意調用類的成員函數時要避免segmantation fault錯誤。
相關文章
相關標籤/搜索