linux多線程學習(二)——線程的建立和退出

來源:互聯網
上載者:User

      在上一篇文章中對線程進行了簡單的概述,它在系統中和編程的應用中,扮演的角色是不言而喻的。學習它、掌握它、吃透它是作為一個程式員的必須作為。在接下來的講述中,所有線程的操作都是使用者級的操作。在LINUX中,一般pthread線程庫是一套通用的線程庫,是由POSIX提出的,因此他的移植性是非常好的。

      建立線程實際上就是確定調用該線程函數的進入點,這裡通常使用的函數是pthread_create。線上程建立之後,就開始運行相關的線程函數。在該函數運行結束,線程也會隨著退出。這是其中退出線程的一種方法,另外一種退出線程的方法就是調用pthread_exit()函數介面,這是結束函數的主動行為。在這裡要注意的是,在使用線程函數時,不要輕易調用exit()函數,因為這樣會使整個進程退出,往往一個進程包含著多個線程,所以調用了exit()之後,所有該進程中的線程都會被結束掉。因此,線上程中,利用pthread_exit來替代進程中的exit。

      由於一個進程中的資料區段是共用的,因此通常線上程退出之後,退出線程所佔的資源並不會隨著線程的結束而得到釋放。正如進程之間可以調用wait()函數來同步中指並釋放資源一樣,線程之間也有類似的機制,那就是pthread_join函數.pthread_join可以將當前線程掛起,等待線程的結束,這個函數是一個阻塞函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待函數的資源就會被釋放。

1、函數文法簡述。

pthread_create

標頭檔:       pthread.h

函數原型:    int pthread_create (pthread_t* thread, pthread_attr_t* attr,

                                                  void* (start_routine)(void*), void* arg);

函數傳入值: thread: 線程標識符

                   attr: 線程屬性設定

                   start_routine:線程函數入口

                   arg:傳遞給線程函數的參數

傳回值:       0: 成功

                   -1: 失敗 

pthread_exit

標頭檔:      pthread.h

函數原型:   void pthread_exit (void*  retval);

函數傳入值:retval:pthread_exit()調用者線程的傳回值,可又其他函數如pthread_join來檢索擷取。

phread_join

標頭檔:      pthread.h

函數原型:   int pthread_join (pthread_t* thread, void** thread_return);

函數傳入值:thread:等待線程的標識符。

                  thread_return:使用者定義的指標,用來儲存被等待線程的傳回值(不為NULL值);

函數傳回值:成功: 0

                  失敗:-1

2、函數舉例實現。

 

#include <stdlib.h><br />#include <stdio.h><br />#include <pthread.h><br />#include <errno.h> </p><p>static void* pthread_func_1 (void*);<br />static void* pthread_func_2 (void*); </p><p>int main (int argc, char** argv)<br />{<br /> pthread_t pt_1 = 0;<br /> pthread_t pt_2 = 0;<br /> int ret = 0; </p><p> ret = pthread_create (&pt_1, NULL, pthread_func_1, NULL);<br /> if (ret != 0)<br /> {<br /> perror ("pthread_1_create");<br /> } </p><p> ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);<br /> if (ret != 0)<br /> {<br /> perror ("pthread_2_create");<br /> } </p><p> pthread_join (pt_1, NULL);<br /> pthread_join (pt_2, NULL); </p><p> return 0;<br />} </p><p>static void* pthread_func_1 (void* data)<br />{<br /> int i = 0; </p><p> for (; i < 6; i++)<br /> {<br /> printf ("This is pthread1!/n"); </p><p> if (i == 2)<br /> {<br /> pthread_exit (0);<br /> } </p><p> sleep (1);<br /> } </p><p> return NULL;<br />} </p><p>static void* pthread_func_2 (void* data)<br />{<br /> int i = 0; </p><p> for (; i < 3; i++)<br /> {<br /> printf ("This is pthread2!/n");<br /> } </p><p> pthread_exit (0); </p><p> return NULL;<br />}<br />

 

在上面的例子中只是簡單的建立了線程、主動退出線程和掛起線程。在下一篇文章中,將講述線程線的屬性及其設定。

 

~~END~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.