原有的程式是利用一台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...