線(xiàn)程是程序中完成一個(gè)獨(dú)立任務(wù)的完整執(zhí)行序列,即一個(gè)可調(diào)度的實(shí)體;進(jìn)程相當(dāng)于運(yùn)行中程序的一種抽象。根據(jù)運(yùn)行環(huán)境的調(diào)度者的身份,線(xiàn)程可分為內(nèi)核線(xiàn)程和用戶(hù)線(xiàn)程。內(nèi)核線(xiàn)程,在有的系統(tǒng)上稱(chēng)為L(zhǎng)WP(Light Weight Process,輕量級(jí)線(xiàn)程),運(yùn)行在內(nèi)核空間,由內(nèi)核調(diào)度;用戶(hù)線(xiàn)程運(yùn)行在用戶(hù)空間,由線(xiàn)程庫(kù)來(lái)調(diào)度。當(dāng)進(jìn)程的一個(gè)內(nèi)核線(xiàn)程獲得CPU的使用權(quán)時(shí),它就加載并運(yùn)行一個(gè)用戶(hù)線(xiàn)程??梢?jiàn),內(nèi)核線(xiàn)程相當(dāng)于用戶(hù)線(xiàn)程運(yùn)行的‘容器’,一個(gè)進(jìn)程可以擁有M個(gè)內(nèi)核線(xiàn)程和N個(gè)用戶(hù)線(xiàn)程,其中M<=N,并且一個(gè)系統(tǒng)的所有進(jìn)程中,M和N的比值是固定的。
線(xiàn)程控制函數(shù)
pthread_create
#include <pthread.h> int pthread_create(pthread_t * tidp, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg); // 返回:成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)
當(dāng)pthread_create函數(shù)返回成功時(shí),有tidp指向的內(nèi)存被設(shè)置為新創(chuàng)建線(xiàn)程的線(xiàn)程ID,其類(lèi)型pthread_t定義為:
#include <bits/pthreadtypes.h> typedef unsigned long int pthread_t;
attr參數(shù)用于設(shè)置各種不同的線(xiàn)程屬性,為NULL時(shí)表示默認(rèn)線(xiàn)程屬性。新創(chuàng)建的線(xiàn)程從start_rtn函數(shù)的地址開(kāi)始運(yùn)行,該函數(shù)只有一個(gè)無(wú)類(lèi)型指針的參數(shù)arg,如果需要向start_rtn函數(shù)傳入的參數(shù)不止一個(gè),可以把參數(shù)放入到一個(gè)結(jié)構(gòu)中,然后把這個(gè)結(jié)構(gòu)的地址作為arg的參數(shù)傳入。
線(xiàn)程創(chuàng)建時(shí)并不能保證哪個(gè)線(xiàn)程會(huì)先運(yùn)行:是新創(chuàng)建的線(xiàn)程還是調(diào)用線(xiàn)程。新創(chuàng)建的線(xiàn)程可以訪(fǎng)問(wèn)調(diào)用進(jìn)程的地址空間,并且繼承調(diào)用線(xiàn)程的浮點(diǎn)環(huán)境和信號(hào)屏蔽字,但是該線(xiàn)程的未決信號(hào)集被清除。那什么是未決信號(hào)呢,信號(hào)產(chǎn)生到信號(hào)被處理這段時(shí)間間隔,稱(chēng)信號(hào)是未決的。