關於pthread h的學習

2021-08-01 19:16:58 字數 2559 閱讀 6633

最近在學習多執行緒程式設計的課題,於是整理了一下學習到的內容。

個人是在window平台使用vs2015,附上vs引入pthread.h的教程和資源:

一、首先介紹最基本的pthread_create函式:

函式原型為

int pthread_create(pthread_t *, const pthread_attr_t*, void*(*start)(void*), void*)

該函式返回值用於判斷執行緒建立是否成功,成功則返回0

pthread_t型別用於儲存執行緒的id,是乙個結構體,擁有p和x兩個成員,其中p是指向執行緒函式的指標

pthread_affr_t型別是乙個執行緒模板,它用於配置執行緒各個資料,比如是否可join

第三個引數是執行緒函式

第四個引數是該執行緒函式的引數,沒有時可以填入null不可省略

乙個正常的使用樣例如下:

void* test(void* args){}

if (ret = pthread_create(&tid2, &attr, test, (void*)&index2) != 0)

cout<<"success\n」;

在如同上面**呼叫此函式後,test與主函式會立即開始非同步執行

二、設定執行緒模板pthread_attr_t:

pthread_attr_init(pthread_attr_t*)函式可以初始化乙個預設的執行緒模板

pthread_attr_setdetachstate(pthread_attr_t*, int detchstate)函式可以把乙個模板設定為特別的分離型別

三、執行緒間的交流,阻斷,同步問題:

一般來說,我們往往需要新的執行緒與主線程有著某種程度上的同步與聯絡。

而且如果新執行緒是乙個不斷迴圈的過程,那麼該執行緒的空轉對系統來說是不必要的浪費,所以我們需要在主線程中實現對副執行緒的控制

①join連線:

int pthread_join(pthread_t *,void**)函式可以阻斷當前執行緒直到新執行緒結束,並獲取新執行緒的返回值指標

該函式只能指定joinable的執行緒,其返回值表明是否成功,0代表成功

使用場合:

主線程可能過快結束,從而其區域性變數等各個資料清空,而如果副執行緒依賴於這些資料,就會導致訪問錯誤。所以可以令主線程等待副執行緒完成後,

再繼續往下執行來避免這種情況發生。

tips:

②互斥鎖pthread_mutex_t:

pthread_mutex_t型別用於定義互斥鎖

互斥鎖定義後要使用 int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*)函式來進行初始化

第二個引數是互斥鎖模板,設為null即為預設模板。

互斥鎖作用域不同的執行緒之間,它有兩個相對的開關函式

pthread_mutex_lock(pthread_mutex_t*)//上鎖

pthread_mutex_unlock(pthread_mutex_t*)//解鎖

任意乙個執行緒一旦執行到乙個lock函式就會判斷對應互斥鎖是否已經上鎖,如果是則會等待到這個互斥鎖解鎖才繼續往下執行

這確保了一整段**內(被互斥鎖上鎖與解鎖函式夾在中間的**段)任何時刻內都只有乙個執行緒在執行

使用場合:

比如多條執行緒同時共享同一塊資料區域,如果乙個執行緒正在修改該區域的資料,另乙個執行緒就開始使用這一部分的資料就有可能出現問題。

所以無論是修改共享區域資料還是讀取共享區域資料都最好通過乙個互斥鎖來確保資料的正確性。

此外互斥鎖還可以作為乙個執行緒的開關使用,如果乙個執行緒從頭到尾都在乙個互斥鎖開合區域內,那麼主城就可以利用上鎖與解鎖來控制線程的執行與否(這個用乙個全域性變數也可以解決)

③條件訊號變數pthread_cond_t:

pthread_cond_t型別用於定義條件訊號變數

條件訊號變數定義後要用int pthread_cond_init(pthread_cond_t*, pthread_condattr_t*)函式來進行初始化

第二引數與互斥鎖類似

同樣類似的是,條件訊號變數也有兩個相對的函式

pthread_cond_signal(pthread_cond_t*)//傳送訊號

pthread_cond_wait(pthread_cond_t*)//等待訊號

任意執行緒一旦執行到乙個wait函式就會停下等待訊號變數發出signal,此功能一般用於兩個執行緒的相互調控

使用場合:

如果執行緒是迴圈形式,其中帶有wait,則可以通過主程的signal在複數個時間點實現同步。這可以防止迴圈的執行緒的空轉,提高效率。

四、空間釋放:

以上的執行緒模板,互斥鎖,條件訊號變數都需要使用函式釋放空間

分別是:

pthread_attr_destroy(pthread_attr_t*);

pthread_mutex_destroy(pthread_mutex_t*)  

pthread_cond_destroy(pthread_cond_t*)  

關於FTP的學習

因為port方式在傳送資料時,由伺服器主動連線客戶端,所以,如果客戶端在防火牆或nat閘道器後面,用port方式將無法與internet上的ftp伺服器傳送檔案。這種情況需要使用pasv方式。幾乎所有的ftp客戶端軟體都支援這兩種方式。特殊的典型例子是ie,ie預設是用port方式的。如果要在ie裡...

關於displaytag的學習

1 基於displaytag的分頁方案 displaytag說明 構造頁面顯示的list displaytag能夠在request和session範圍內獲得相關的list。所有的資料必須從list中獲得。1.單錶查詢結果集 list userlist gethibernatetemplate fin...

關於sequence的學習

sql create sequence b q s 1 2 start with 1 3 increment by 1 序列已建立。sql select b q s 1.currval from dual select b q s 1.currval from dual 第 1 行出現錯誤 ora ...