【技術問題】C++多線程pthread_create error: invalid use of non-static member function

問題如下

pthread_create error: invalid use of non-static member function

先簡要解釋下pthread_create這個函數的各個參數:
param1: 爲指向線程標識符的指針。
param2: 用來設置線程屬性。
param3: 線程運行函數的起始地址。
param4: 運行函數的參數。

出錯往往是第三個參數,報錯的原因要求我們要將該參數設置成靜態函數,但是這裏有個問題 ,這個函數我們往往可能需要訪問到它所屬類的非靜態成員變量,而設置成靜態函數的話只能訪問靜態變量了。就如下這個例子是編譯不過的

/* 錯誤例子 */
//StaticAddOne這個函數是HttpServer的靜態成員函數
void* HttpServer::StaticAddOne(){
    this->nums ++;  //this不能出現在靜態成員中,編譯不通過
}

那怎麼辦呢,我們可以再寫一個靜態函數,然後把上面的AddOne放進去。注意 此時我們就不需要static來修飾AddOne函數了。

//Static_ExecAddOne這個函數是HttpServer的靜態成員函數
void* HttpServer::Static_ExecAddOne(void* pThis)
{
	static_cast<HttpServer *>(pThis)->AddOne();
}

使用pthread_create的使用只需要把this指針當做參數傳入就行了,如下:

pthread_create(&thread_id, NULL, Static_ExecAddOne, (void*)this);

這樣就可以保證AddOne可以訪問到類中的其他非靜態成員變量了,同時也不會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章