有不少時候,咱們但願能夠在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 fault
。this
總結:spa
segmantation fault
錯誤。