多線程編程-線程的建立和終止

來源:互聯網
上載者:User

轉載:http://software.intel.com/zh-cn/blogs/2011/09/22/400007583/

1.引言:

Linux系統下的多線程遵循POSIX線程介面,稱為pthread。編寫Linux下的多線程程式,需要使用標頭檔pthread.h,串連時需要使用庫libpthread.a。順便說一下,Linux下pthread的實現是通過系統調用clone()來實現的。clone()是Linux所特有的系統調用,它的使用方式類似fork,關於clone()的詳細情況,有興趣的讀者可以去查看有關文檔說明。

  pthread_t在標頭檔/usr/include/bits/pthreadtypes.h中定義:

  typedef unsigned long int pthread_t;

它是一個線程的標識符。

2.函數說明:

(1)函數原型:

#include

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);

傳回值:若是成功建立線程返回0,否則返回錯誤的編號

形式參數:

pthread_t *restrict tidp 要建立的線程的線程id指標

const pthread_attr_t *restrict attr 建立線程時的線程屬性

void* (start_rtn)(void) 傳回值是void類型的指標函數

void *restrict arg start_rtn的行參

例題1:

功能:測試建立一個新的線程

程式名稱: pthread_test.c

#include

#include

void *create(void *arg)

{

printf("new thread created ..... ");

}

int main(int argc,char *argv[])

{

pthread_t tidp;

int error;

error=pthread_create(&tidp,NULL,create,NULL);

if(error!=0)

{

printf("pthread_create is not created ... ");

return -1;

}

printf("prthread_create is created... ");

return 0;

}

編譯方法:

#gcc -Wall -lpthread pthread_test.c

因為pthread的庫不是linux系統的庫,所以在進行編譯的時候要加上-lpthread,否則編譯不過,會出現下面錯誤:

thread_test.c: 在函數 ‘create’ 中:

thread_test.c:7: 警告: 在有傳回值的函數中,程式流程到達函數尾

/tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):對‘pthread_create’未定義的引用

collect2: ld 返回 1

2、線程的終止與結束

(1) 終止線程

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

參數:其中*retval為線程退出的狀態。這個函數一般線上程中途退出時使用。

作用:此函數的作用是使當前線程退出並釋放它使用的線程相關資源。

傳回值: 當調用線程是進程中的最後一個非守護線程,進程將用狀態0退出。當最初的線程從main()函數中返回時進程用該線程main函數的傳回值退出。

(2) 等待線程結束

原型如下:

int pthread_join(pthread_t th, void **thread_return)

參數:th 為被等待的線程標識符

thread_return 為一個使用者定義的指標,它可以用來儲存被等待線程的傳回值

作用:函數pthread_join用來等待一個線程的結束。

說明: 這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。此函數用於進程和線程的同步,防止主線程提前結束,致使其它線程無法執行。如主線程建立了兩個線程,就有可能在兩個派生線程沒有執行時,主線程就已經結束了,而主線程結束,對系統而言,就意味這個進程已經結束,那麼派生線程自然就沒有機會執行了。所以用pthread_join等待派生線程的結束

傳回值:調用成功時返回0,否則將返回一個非0的錯誤碼。

(3)分離線程pthread_detach

int pthread_detach(pthread_t tid);

作用:將非分離的線程設定為分離線程。即通知線程庫在指定的線程終止時回收線程佔用的記憶體等資源。

傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

在一個線程上使用多次pthread_detach的結果是不可預見的。

(4)線程的取消

當我們希望終止一個線程時,我們可以使用函數pthread_cancel()。其原型定義如下:

原型: int pthread_cancel(pthread_t thread);

說明:這個函數以一個線程ID作為參量,向此線程發送一個取消請求。線程處理這個請求的方式取決於線程的狀態。它可能立即作出反映,也可能等到它得到一個取消點時在行動,也可能完全忽略它。

(5)設定線程取消狀態

線程可以用pthread_setcancelstate函數來設定自己的取消狀態,

原型定義如下:int pthread_setcancelstate(int state, int *oldstate);

參數說明:

state 取值可以是PTHREAD_CNACEL_ENABLE,這個值允許線程接收取消請求;或是PTHREAD_CNACEL_ENABLE,它的作用是忽略取消請求。

oldstate 用於擷取先前的取消狀態。如果取消請求接受了,線程可以進入第二個控制層次,用pthread_setcanceltype設定取消類型。

(6)設定取消類型

原型定義如下:int pthread_setcanceltype(int type, int *oldtype);

參數說明:

type 取值可以是PTHREAD_CANCEL_ASYNCHRONOUS,它將使得線程在接收到取消請求後立即處理(asynchronous),或是PTHREAD_CANCEL_DEFERRED,它將使得線程在接收到取消請求後,一直延遲處理,直到遇到一個取消點(defer)之後才處理。

odtype 作用是允許儲存先前的狀態,如果不想直到先前的狀態,可以傳遞NULL給它。

在預設的情況下,線程在啟動是的取消狀態為PTHREAD_CNACEL_ENABLE,取消類型為PTHREAD_CANCEL_DEFERRED。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.