2008-03-13 11:01
19764人閱讀
收藏舉報
linux
多執行緒thread
join
windows
程式設計摘自資料(linux 與windows不同)
使用多執行緒的理由之一是和程序相比,它是一種非常"節儉"的多工操作方式。我們知道,在linux系統下,啟動乙個新的程序必須分配給它獨立的位址空間,建立眾多的資料表來維護它的**段、堆疊段和資料段,這是一種"昂貴"的多工工作方式。而執行於乙個程序中的多個執行緒,它們彼此之間使用相同的位址空間,共享大部分資料,啟動乙個執行緒所花費的空間遠遠小於啟動乙個程序所花費的空間,而且,執行緒間彼此切換所需的時間也遠遠小於程序間切換所需要的時間。
使用多執行緒的理由之二是執行緒間方便的通訊機制。對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然,由於同一程序下的執行緒之間共享資料空間,所以乙個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便。當然,資料的共享也帶來其他一些問題,有的變數不能同時被兩個執行緒所修改,有的子程式中宣告為static的資料更有可能給多執行緒程式帶來災難性的打擊,這些正是編寫多執行緒程式時最需要注意的地方。 1、簡單的多執行緒程式
首先在主函式中,我們使用到了兩個函式,pthread_create和pthread_join,並宣告了乙個pthread_t型的變數。 pthread_t在標頭檔案pthread.h中已經宣告,是執行緒的標示符
函式pthread_create用來建立乙個執行緒,函式原型:
和程序相比,執行緒的最大優點之一是資料的共享性,各個程序共享父程序處沿襲的資料段,可以方便的獲得、修改資料。但這也給多執行緒程式設計帶來了許多問題。我們必須當心有多個不同的程序訪問相同的變數。許多函式是不可重入的,即同時不能執行乙個函式的多個拷貝(除非使用不同的資料段)。在函式中宣告的靜態變數常常帶來問題,函式的返回值也會有問題。因為如果返回的是函式內部靜態宣告的空間的位址,則在乙個執行緒呼叫該函式得到位址後使用該位址指向的資料時,別的執行緒可能呼叫此函式並修改了這一段資料。在程序中共享的變數必須用關鍵字volatile來定義,這是為了防止編譯器在優化時(如gcc中使用-ox引數)改變它們的使用方式。為了保護變數,我們必須使用訊號量、互斥等方法來保證我們對變數的正確使用。
4、互斥鎖
互斥鎖用來保證一段時間內只有乙個執行緒在執行一段**。必要性顯而易見:假設各個執行緒向同乙個檔案順序寫入資料,最後得到的結果一定是災難性的
Linux多執行緒通訊
include include define buffer size 16 緩衝區數量 struct prodcons 初始化緩衝區結構 void init struct prodcons b 生產者將產品放入緩衝區,這裡是存入乙個整數 void put struct prodcons b,int ...
執行緒通訊,多執行緒
多執行緒 thread handler thread處理一些複雜的業務邏輯 耗時的事情 handler在主線程中接收訊息的乙個物件 mhandler.sendmessage msg 傳送乙個訊息物件 mhandler.sendemptymessage what 傳送空訊息,只有what沒有obj m...
多執行緒 執行緒通訊
總結 今天小鹹兒來講解乙個好玩的事,那就是執行緒之間該如何通訊,執行緒通訊之後又會出現什麼問題?先來一張導圖來看看執行緒通訊的分布?疑問 如果想要執行緒按照使用者自定義的順序執行的話,那該如何操作呢?思考 如果能夠讓執行緒等待先執行的執行緒執行完,再執行不就能達到效果了嗎!果然出現問題之後,就會有對...