C 多執行緒程式設計

2021-08-29 20:10:54 字數 3780 閱讀 4398

執行緒是多工處理的一種特殊形式,多工處理允許讓電腦同時執行兩個或兩個以上的程式。一般情況下,兩種型別的多工處理:基於程序和基於執行緒

pthread_t 定義執行緒變數。

pthread_create(thread, attr, start_routine, arg);

建立新的執行緒,並讓其執行,引數說明:

thread : 指向執行緒嗯識別符號指標。

attr:不透明的屬性物件,可以被用來設定執行緒屬性。你可以制定執行緒屬性物件愛嗯,也可以使用預設值null。

star『t_routine:執行緒執行函式的起始位址,一旦執行緒被建立就用執行。

arg :執行函式的引數,它必須通過把引用作為指標強制轉換為void型別進行傳遞,如果沒有傳遞引數,則使用null。

函式建立成功返回值為0,否則為失敗。(憑藉此可以判斷執行緒是否建立成功)

執行緒終止函式:pthread_exit(status) ;//可以終止乙個posix執行緒

該函式用於顯式的退出乙個執行緒,一般使用情況是,執行緒完成工作後無需繼續存在時被呼叫。

tips:

如果main()是再它建立的執行緒之前結束,並通過pthread_exit()退出,那麼其他執行緒將繼續執行,否則,他們會再main()結束時被自動終止。

#include // 必須的標頭檔案

#include using namespace std;

#define num_threads 5

// 執行緒的執行函式

void* say_hello(void* args)

int main()

}//等各個執行緒退出後,程序才結束,否則程序強制結束了,執行緒可能還沒反應過來;

pthread_exit(null);

}

linux不包含pthread庫,編譯時使用:

$ g++ test.cpp -lpthread -o test.o
#include #include #include using namespace std;

#define num_threads 5

void *printhello(void *threadid)

int main ()

}pthread_exit(null);

}

可以像新建子執行緒傳遞引數,**:

#include #include #include using namespace std;

#define num_threads 5

struct thread_data;

void *printhello(void *threadarg)

int main ()

}pthread_exit(null);

}

連線與分離執行緒:

pthread_join(threadid, status);連線

pthread_detach(threadid);分離

join是三種同步執行緒的方式之一。另外兩種分別是互斥鎖(mutex)和條件變數(condition variable)。 

呼叫pthread_join()將阻塞自己,一直到要等待加入的執行緒執行結束。

可以用pthread_join()獲取執行緒的返回值。 

乙個執行緒對應乙個pthread_join()呼叫,對同乙個執行緒進行多次pthread_join()呼叫是邏輯錯誤。

join or detach 

執行緒分兩種:一種可以join,另一種不可以。該屬性在建立執行緒的時候指定。 

joinable執行緒可在建立後,用pthread_detach()顯式地分離。但分離後不可以再合併。該操作不可逆。 

為了確保移植性,在建立執行緒時,最好顯式指定其join或detach屬性。似乎不是所有posix實現都是用joinable作預設。 

#posix:可移植作業系統介面(portable operating system inte***ce of unix)

pthread_detach()詳解:

建立乙個執行緒預設的狀態是joinable, 如果乙個執行緒結束執行但沒有被join,則它的狀態類似於程序中的zombie process,即還有一部分資源沒有被**(退出狀態碼),所以建立執行緒者應該呼叫pthread_join來等待執行緒執行結束,並可得到執行緒的退出**,**其資源(類似於wait,waitpid) 

但是呼叫pthread_join(pthread_id)後,如果該執行緒沒有執行結束,呼叫者會被阻塞,在有些情況下我們並不希望如此,比如在web伺服器中當主線程為每個新來的鏈結建立乙個子執行緒進行處理的時候,主線程並不希望因為呼叫pthread_join而阻塞(因為還要繼續處理之後到來的鏈結),這時可以在子執行緒中加入** 

pthread_detach(pthread_self()) 

或者父執行緒呼叫 

pthread_detach(thread_id)(非阻塞,可立即返回) 

這將該子執行緒的狀態設定為detached,則該執行緒執行結束後會自動釋放所有資源。

pthread_join():

呼叫pthread_join的執行緒會阻塞,直到指定的執行緒返回,呼叫了pthread_exit,或者被取消。 

如果執行緒簡單的返回,那麼rval_ptr被設定成執行緒的返回值,參見範例1;如果呼叫了pthread_exit,則可將乙個無型別指標返回,在pthread_join中對其進行訪問,參見範例2;如果執行緒被取消,rval_ptr被設定成pthread_canceled。 

如果我們不關心執行緒的返回值,那麼我們可以把rval_ptr設定為null。 

#include #include #include using namespace std;

void *thr_fn1(void *arg)

void *thr_fn2(void *arg)

int main()

pthread_join用於等待乙個執行緒的結束,也就是主線程中要是加了這段**,就會在加**的位置卡主,直到這個執行緒執行完畢才往下走。

pthread_exit用於強制退出乙個執行緒(非執行完畢退出),一般用於執行緒內部。

c++禁止將void指標隨意賦值給其他指標。

#include #include void* thread1(void *s)

void* thread2(void *s)

/**************main function ****************/

int main(void)

pthread_join(id1,&a1);

printf("%s\n",(char*)a1);

if(ret2!=0)

printf("this is the main process.\n");

pthread_join(id2,&a2);

printf("%s\n",*(int*)a2);

return 0;

}

pthread_attr_t 執行緒屬性

pthread_attr_t attr;//建立

pthread_attr_init(&attr)//初始化

pthread_attr_setdatachstate(&attr, pthread_create_joinable)//設定執行緒屬性,pthread_create_detached將導致使用attr建立的所有執行緒處於分離狀態,而使用值pthread_create_joinable將導致使用attr建立的所有執行緒處於可連線狀態。

C 多執行緒程式設計

一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...

C 多執行緒程式設計

乙個程序通常定義為程式的乙個例項。在win32中,程序佔據4gb的位址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,乙個win32程序並不執行什麼指令,它只是佔據著4gb的位址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...

C 多執行緒程式設計

建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,使用預設安全形態,設為null,表明不可被子執行緒繼承 size t dwstacksize,初始棧大小,預設值0表示使用與呼叫該函式的執行緒相同的棧大小 lp...