1. 程式人生 > >在C++類中使用pthread實現多執行緒

在C++類中使用pthread實現多執行緒

現在pthread的api已經相當完善,使用其實現多執行緒難度不大,但是值得注意的一點是當想在類中使用pthread,呼叫pthread_create函式時,傳入的執行函式,也就是下面這個原型的第三個引數void * ( * start_routine) (void *),如果是類的成員函式,必須是靜態函式,否則將編譯不通過,編譯器會出一個這種錯誤。因為類的this指標在多執行緒下操作的問題,非靜態的成員函式是不被允許傳入的。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                            void *(*start_routine) (void *)
, void *arg);
‘void*’ to ‘void* (*)(void*)’ c++?

這裡只能使用靜態函式將帶來一個問題,靜態成員函式無法訪問非靜態的成員,這將帶來許多不便,總不能將要用到的成員變數也改成靜態的,這是不推薦的。我個人使用的是一種類似跳板的方式來解決。
首先這是一個pthread_create函式:

pthread_create(&thread, NULL, &test, (void *)this);

接下來是test函式的實現,function即為自己真正要執行的函式,這樣就解決了需要訪問非靜態成員的問題。當然如果要傳的引數比較多,自己寫一個struct傳遞就行了。

static void *test(void * arg) {
    return static_cast<ClassName *>(arg)->function();
}

另外,也可以用標準庫的thread,效率上個人認為是差不多的,不過thread是可以跨平臺的。

std::thread thread(&test, this);