多執行緒程式設計1

2021-06-14 13:06:46 字數 3473 閱讀 1130

一,建立執行緒和退出執行緒

在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物...