pthread create使用類中函式指標的

2021-06-19 19:26:56 字數 1559 閱讀 3162

原有的程式是利用一台pc機的共享記憶體來實現兩個程式間的通訊的,最近要求改了,要設計2臺pc間這兩個的程式的通訊,想把通訊部分的程式做成類封裝起來。其中,由於要有多執行緒的部分。就是說,可能在乙個執行緒裡讀,在另乙個執行緒裡寫。所以得用到類成員函式的函式指標部分。

為了驗證可行性,編寫了下面的程式:

class mythread

};//;不要忘了分號

int mythread::num = 0;

int main(void)

以上是驗證程式。

另外,我還做個驗證程式,跟上面的問題沒有關係,是關於read,write的阻塞和執行緒的關係。read,write的阻塞會使當前的程序掛起,直到可以繼續讀或者寫為止。但是如果這個程序裡有開了別的執行緒,read,write的阻塞的阻塞會不會將同乙個程序下的其他執行緒也阻塞掉呢? 我做了個簡單的驗證試驗,在上面的mythread類的threadtorun函式中讀出資料,在main函式中(注釋的其他部分,沒有也行的那部分)加入寫入資料。每次向pipe內寫入10240個資料,每次在得到使用者輸入後唯讀1024個。這樣就一定會在主函式中發生阻塞。

如果,讀寫阻塞會將同乙個程序內的所以執行緒一起阻塞,那麼程式就無法正常執行下去(因為讀的部分也被掛起了)。而事實正好相反,這就說明,讀寫阻塞並不會把同一程序下的其他執行緒都阻塞。

昨天想了一下,和cypher的想法不謀而合,加乙個全域性函式,這樣可以解決問題,雖然**看上去有點累贅: 

#include  

class   a 

; void*   threadstub(void*   arg) 

void   a::run() 

另,再請教一下cypher,你說的"強制取類成員函式的位址是有辦法的,你做兩次位址轉換就可以了",具體可以舉例說明一下麼.希望以後多多指教,謝謝! 

這裡的論壇用法不熟悉,剛看到,sorry。 

直接給不同型別的指標賦值肯定是錯誤的,因為它本身是個變數,但不同變數的位址之間是可以任意轉換的。下面給乙個例子,為了方便我直接用c的方式轉換了(這其實是最強的轉換方式): 

#include  

#include  

class   testfunc 

;  testfunc(int   ipara)   :   ival(ipara)   {}; 

void   print(void); 

}; typedef   void   (testfunc::*memfuncptr)(void); 

typedef   void   (*gfuncptr)(testfunc   const   *); 

void   testfunc::print() 

void   main() 

你可以試一試建立乙個物件呼叫pgfunc看結果會怎麼樣,一般來說會當掉: 

testfunc   objtestfunc(200); 

pgfunc(&objtestfunc); 

我原來測試這一問題時才可笑,陰差陽錯的居然結果正確,高興了沒多久,結果發現任何加或去掉一條語句程式都會死掉。 

因為這裡訪問了this-> ival,而實際上this指標從暫存器取,所以並不是你傳的引數。

使用pthread create 建立執行緒

可以通過pthread create 函式建立新執行緒。include int pthread create pthread t restrict tidp,const pthread attr t restrict attr,void start rtn void void restrict ar...

pthread create 函式的安全使用

1 pthread create 函式的安全使用問題 做過linux多執行緒開發的人都會用過pthread create函式,但是很少人會注意到 主線程在使用pthread create建立執行緒時,如果pthread create 函式的第四個引數 指標引數 傳入的值會被主線程隨時修改時,這時我們...

pthread create 函式用法

天開始學習linux下用c開發多執行緒程式,linux系統下的多執行緒遵循posix執行緒介面,稱為pthread。include int pthread create pthread t restrict tidp,const pthread attr t restrict attr,void s...