程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第一百零八回:C語言實例--線程創建與結束一)

一起talk C栗子吧(第一百零八回:C語言實例--線程創建與結束一)

編輯:關於C語言

一起talk C栗子吧(第一百零八回:C語言實例--線程創建與結束一)



各位看官們,大家好,上一回中咱們說的是線程概述的例子,這一回咱們說的例子是:線程創建與結束。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

看官們,我們這一回介紹一下如何創建和結束線程。線程通常是隨著進程的創建而創建的,因為線程依賴於進程,進程創建成功後會創建線程來完成一些工作。比如我們在上一回中介紹的firefox進程,它在啟動的時候創建了很多線程。

線程的結束通常由進程來控制,進程依據程序的需要來結束線程。不過有一點可以肯定的是:使用exit函數結束進程時,該進程創建的線程會隨著進程的結束而結束。

我這麼說,大家可能感覺比較抽象,接下來我們通過具體的例子來說明如何創建和結束線程。在介紹之前,我們先介紹三個與線程相關的函數:

1.pthread_create函數

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

該函數用來創建線程,該函數有四個參數,接下來我們分別介紹它們:

第一個參數是pthread類型的指針,函數運行成功後,該指針指向新創建線程的標識符,我們可以通過操作線程的標識符來操作線程; 第二個參數是pthread_attr_t類型的指針,該指針指向包含有線程屬性的變量,這些屬性會賦值給新創建的線程。如果我們不想修改線程的屬性,那麼可以使用空指針; 第三個參數是一個函數指針,該指針指向的函數擁有一個參數,參數類型是void類型的指針,函數返回 void類型的指針。新線程創建成功後會執行該函數; 第四個參數是void類型的指針,該指針指向的變量被當作第三個參數中函數的參數; 該函數運行成功時返回零,否則返回相應的錯誤代碼。

2.pthread_exit函數

void pthread_exit(void *retval);

該函數用來結束線程,該函數只有一個參數。

參數為void類型的指針,該指針指向的變量包含有線程結束時的內容。它通常用來存放線程結束的狀態。 該函數運行成功時返回零,否則返回相應的錯誤代碼。

3.pthread_join函數

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));

該函數看著很復雜,其它和我們剛才介紹的一樣,只不過是在函末尾多了個小尾巴而已。

各位看官,關於線程創建與結束的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved