各位看官們,大家好,上一回中咱們說的是線程概述的例子,這一回咱們說的例子是:線程創建與結束。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,我們這一回介紹一下如何創建和結束線程。線程通常是隨著進程的創建而創建的,因為線程依賴於進程,進程創建成功後會創建線程來完成一些工作。比如我們在上一回中介紹的firefox進程,它在啟動的時候創建了很多線程。
線程的結束通常由進程來控制,進程依據程序的需要來結束線程。不過有一點可以肯定的是:使用exit函數結束進程時,該進程創建的線程會隨著進程的結束而結束。
我這麼說,大家可能感覺比較抽象,接下來我們通過具體的例子來說明如何創建和結束線程。在介紹之前,我們先介紹三個與線程相關的函數:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
該函數用來創建線程,該函數有四個參數,接下來我們分別介紹它們:
第一個參數是pthread類型的指針,函數運行成功後,該指針指向新創建線程的標識符,我們可以通過操作線程的標識符來操作線程; 第二個參數是pthread_attr_t類型的指針,該指針指向包含有線程屬性的變量,這些屬性會賦值給新創建的線程。如果我們不想修改線程的屬性,那麼可以使用空指針; 第三個參數是一個函數指針,該指針指向的函數擁有一個參數,參數類型是void類型的指針,函數返回 void類型的指針。新線程創建成功後會執行該函數; 第四個參數是void類型的指針,該指針指向的變量被當作第三個參數中函數的參數; 該函數運行成功時返回零,否則返回相應的錯誤代碼。
void pthread_exit(void *retval);
該函數用來結束線程,該函數只有一個參數。
參數為void類型的指針,該指針指向的變量包含有線程結束時的內容。它通常用來存放線程結束的狀態。 該函數運行成功時返回零,否則返回相應的錯誤代碼。
int pthread_join(pthread_t thread, void **retval);
該函數用來等待線程結束,通常用來做簡單的同步,它的作用類似於進程中的wait函數;
第一個參數是pthread_t類型的變量,它包含著線程的標識符,我們可以通過pthread_create函數的第一個參數來得到該變量的值; 第二個參數是一個二級指針,它指向pthread_exit函數的參數,因此,通常情況下我們用該指針來獲取線程結束時的狀態; 該函數運行成功時返回零,否則返回相應的錯誤代碼。使用這三個函數的時候都需要包含 “pthread.h”頭文件。另外,在我們使用的Mint中該文件的位置如下:
/usr/include/pthread.h
大家可以打開看看裡面的內容。比如該文件中pthread_create函數的原型如下:
extern int pthread_create (pthread_t *__restrict __newthread,
const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg) __THROWNL __nonnull ((1, 3));
該函數看著很復雜,其它和我們剛才介紹的一樣,只不過是在函末尾多了個小尾巴而已。
各位看官,關於線程創建與結束的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。