一,建立執行緒和退出執行緒
在linux系統中,所有與執行緒相關的函式都是以pthread開頭的。pthread_create函式用於在當前程序中加入新的執行緒。linux系統中線程的建立與unix系統存在著不同。在linux系統中,當呼叫pthread_create函式來建立執行緒時,系統首先先建立乙個新的程序,再在該程序內再建立需要的執行緒。新建立的程序與原有的程序是共享記憶體的,因此,與呼叫fork而產生的程序存在著本質的區別。同時,在第一次呼叫pthread_create函式時,系統還會建立乙個管理程序,用於對多執行緒的管理。
標頭檔案
#include
函式原型
int pthread_create(pthread_t * tidp,
const pthread_attr_t *attr,
void *(*start_rtn)(void), void *arg)
返回值 成功
失敗是否設定errno0
-1 是
函式功能:建立新的執行緒
引數說明:tidp:執行緒id attr:執行緒屬性(通常為空) start_rtn:執行緒要執行的函式arg:start_rtn的引數
說明:新的執行緒將擁有自己的堆。同時,從建立執行緒處繼承排程優先順序。如果pthread_create函式呼叫失敗,將不會建立新的執行緒。
錯誤資訊:
eagain:系統沒有足夠的資源來建立新的執行緒,或系統達到最大執行緒數(pthread_threads_max)。
einval:引數attr非法。
eperm:函式呼叫者沒有相應的設定執行緒排程引數或策略的許可權。
注意:因為pthread的庫不是linux系統的庫,所以在進行編譯的時候要加上-lpthread
# gcc filename –lpthread
例項:
程式為使用pthread_create函式來建立執行緒的例項。在程式中呼叫pthread_create函式來啟動新的執行緒。呼叫sleep函式的目的是保證程序在新執行緒執行之前不會退出。具體**如下:
#include #include #include void *thread_info(void)
int main(void)
//保證主線程會在建立執行緒執行完成之後結束
sleep(5);
return (0);
}執行結果:
[root@localhost test]# gcc -wall -lpthread pthread_create.c -o pthread_create
[root@localhost test]# ./pthread_create
in thread_info function!
[root@localhost test]#
補充:函式pthread_tpthread_self(void)
功能:獲取呼叫執行緒的threadidentifier(執行緒id)。
二,pthread_exit函式
如果程序中任何乙個執行緒中呼叫exit或_exit,那麼整個程序都會終止。執行緒的正常退出方式有以下幾種:
(1):建立執行緒時指定要執行的函式執行完畢。
(2):建立執行緒的程序退出。
(3):某個執行緒呼叫了exec函式。
(4):執行緒呼叫了pthrea_exit函式退出。
(5):執行緒被pthread_cancel終止。
從上面可以了解到使用pthread_exit函式可以讓執行的程序退出。pthread_exit函式的具體資訊如下所示:
pthread_exit函式
標頭檔案#include
函式原型
void pthread_exit(void *value_ptr);
返回值 成功
失敗是否設定errno——
—— ——
說明:pthread_exit函式用於結束執行緒的執行。引數value_ptr設定執行緒退出的返回值。由於value_ptr為指向記憶體空間的指標,value_ptr必須指向執行緒退出後任然存在的空間,value_ptr指標不能執行區域性變數。
如果在程序的main函式中呼叫pthread_exit函式,主函式所在的執行緒將退出。但是使用return的話,實際上程序將退出,從而導致所有的執行緒退出。如果return包含在pthread_cleanup_push函式和pthread_cleanup_pop函式之間,那麼執行緒將不會呼叫清理函式,程式將提示出現段錯誤。
三,執行緒等待
建立乙個執行緒,在程序中通過呼叫函式pthread_join等待執行緒結束,這個函式是乙個執行緒阻塞的函式,呼叫它的程序將一直等待直到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源被**。具體函式如下:
pthread_join函式
標頭檔案#include
函式原型
int pthread_join(pthread_t thread,
void **value_ptr);
返回值 成功
失敗是否設定errno0
非0值 是
函式功能:等待乙個執行緒結束
引數說明:thread為要等待的執行緒識別符號;value_ptr為乙個使用者自定義的指標,它可以用來儲存被等待程序的返回值。
錯誤資訊:
einval:引數thread中指定的執行緒為非可連線的執行緒。
esrch:無thread引數指定的執行緒。
edeadlk:指定執行緒中存在死鎖。
例項:
#include #include //用於儲存執行緒中要顯示的資訊的結構體
struct thread_param
;//執行緒要執行的函式
void *thread_fun(void *param)
return (null);
}int main(void)
info2.info = 's';
info2.num = 3;
//建立執行緒,執行緒要執行的函式引數為info2
ret = pthread_create(&tid2, null, thread_fun, (void *)&info2);
if (ret == -1)
//等待建立的執行緒tid1的結束
if (pthread_join(tid1, null) != 0)
//等待建立的執行緒tid2的結束
if (pthread_join(tid2, null) != 0)
return (0);
}執行結果:
[root@localhost test]# ./pthread_join
0: t
1: t
0: s
1: s
2: s
[root@localhost test]#
多執行緒程式設計(1)
一 建立執行緒 函式 handle createthread lpsecurity attributeslpthreadattributes sddworddwstacksize initial stack sizelpthread start routinelpstartaddress threa...
多執行緒程式設計 1
為了以後忘記以後可以再看,所以記錄下.程式開始後將有乙個主線程,即 thread.currentthread乙個簡單的示例,阻塞當前執行緒 這裡建立了2個執行緒,然後呼叫start方法啟動執行緒.修改上面程式,阻塞第1個執行緒 可以看到兩個執行緒互不影響 我想能不用執行緒就不要用,因為執行緒很複雜....
多執行緒程式設計1
管理執行緒的函式和類在 thread 中宣告,而保護共享資料的函式和類在其他標頭檔案中宣告 每個執行緒都必須有乙個初始函式,新執行緒的執行從這裡開始。對於應用程式來說,初始執行緒是main 但是對於其他執行緒,可以在std thread物件的建構函式中指定,本例中,被命名為t的std thread物...