資源描述:
《實(shí)驗(yàn)七:linux多線(xiàn)程編程(實(shí)驗(yàn)報(bào)告)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、實(shí)驗(yàn)七:Linux多線(xiàn)程編程(實(shí)驗(yàn)報(bào)告)實(shí)驗(yàn)七:Linux多線(xiàn)程編程(4課時(shí))實(shí)驗(yàn)?zāi)康模赫莆站€(xiàn)程的概念;熟悉Linux下線(xiàn)程程序編譯的過(guò)程;掌握多線(xiàn)程程序編寫(xiě)方法。實(shí)驗(yàn)原理:為什么有了進(jìn)程的概念后,還要再引入線(xiàn)程呢?使用多線(xiàn)程到底有哪些好處?什么的系統(tǒng)應(yīng)該選用多線(xiàn)程?我們首先必須回答這些問(wèn)題。1多線(xiàn)程概念使用多線(xiàn)程的理由之一是和進(jìn)程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式。運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線(xiàn)程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線(xiàn)程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間。使用多線(xiàn)程的理由之二是線(xiàn)程間方便
2、的通信機(jī)制。同一進(jìn)程下的線(xiàn)程之間共享數(shù)據(jù)空間,所以一個(gè)線(xiàn)程的數(shù)據(jù)可以直接為其它線(xiàn)程所用,這不僅快捷,而且方便。2多線(xiàn)程編程函數(shù)Linux系統(tǒng)下的多線(xiàn)程遵循POSIX線(xiàn)程接口,稱(chēng)為pthread。編寫(xiě)Linux下的多線(xiàn)程程序,需要使用頭文件pthread.h,連接時(shí)需要使用庫(kù)libpthread.a。pthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義:typedefunsignedlongintpthread_t;它是一個(gè)線(xiàn)程的標(biāo)識(shí)符。函數(shù)pthread_create用來(lái)創(chuàng)建一個(gè)線(xiàn)程,它的原型為
3、:externintpthread_create((pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg));第一個(gè)參數(shù)為指向線(xiàn)程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來(lái)設(shè)置線(xiàn)程屬性,第三個(gè)參數(shù)是線(xiàn)程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。函數(shù)pthread_join用來(lái)等待一個(gè)線(xiàn)程的結(jié)束。函數(shù)原型為:externintpthread_join(pthread_tth,void**thread_return);第一個(gè)參數(shù)為被等待的線(xiàn)程標(biāo)
4、識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶(hù)定義的指針,它可以用來(lái)存儲(chǔ)被等待線(xiàn)程的返回值。函數(shù)pthread_exit的函數(shù)原型為:externvoidpthread_exit(void*retval);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是NULL,這個(gè)值將被傳遞給thread_return。3修改線(xiàn)程的屬性線(xiàn)程屬性結(jié)構(gòu)為pthread_attr_t,它在頭文件/usr/include/pthread.h中定義。屬性值不能直接設(shè)置,須使用相關(guān)函數(shù)進(jìn)行操作,初始化的函數(shù)為pthread_attr
5、_init,這個(gè)函數(shù)必須在pthread_create函數(shù)之前調(diào)用。設(shè)置線(xiàn)程綁定狀態(tài)的函數(shù)為pthread_attr_setscope,它有兩個(gè)參數(shù),第一個(gè)是指向?qū)傩越Y(jié)構(gòu)的指針,第二個(gè)是綁定類(lèi)型,它有兩個(gè)取值:PTHREAD_SCOPE_SYSTEM(綁定的)和PTHREAD_SCOPE_PROCESS(非綁定的)。另外一個(gè)可能常用的屬性是線(xiàn)程的優(yōu)先級(jí),它存放在結(jié)構(gòu)sched_param中。用函數(shù)pthread_attr_getschedparam和函數(shù)pthread_attr_setschedparam進(jìn)行存放,一般說(shuō)來(lái),我們總是先取優(yōu)
6、先級(jí),對(duì)取得的值修改后再存放回去。4線(xiàn)程的數(shù)據(jù)處理和進(jìn)程相比,線(xiàn)程的最大優(yōu)點(diǎn)之一是數(shù)據(jù)的共享性,各個(gè)進(jìn)程共享父進(jìn)程處沿襲的數(shù)據(jù)段,可以方便的獲得、修改數(shù)據(jù)。但這也給多線(xiàn)程編程帶來(lái)了許多問(wèn)題。我們必須當(dāng)心有多個(gè)不同的進(jìn)程訪(fǎng)問(wèn)相同的變量。許多函數(shù)是不可重入的,即同時(shí)不能運(yùn)行一個(gè)函數(shù)的多個(gè)拷貝(除非使用不同的數(shù)據(jù)段)。在函數(shù)中聲明的靜態(tài)變量常常帶來(lái)問(wèn)題,函數(shù)的返回值也會(huì)有問(wèn)題?;コ怄i互斥鎖用來(lái)保證一段時(shí)間內(nèi)只有一個(gè)線(xiàn)程在執(zhí)行一段代碼。必要性顯而易見(jiàn):假設(shè)各個(gè)線(xiàn)程向同一個(gè)文件順序?qū)懭霐?shù)據(jù),最后得到的結(jié)果一定是災(zāi)難性的。條件變量互斥鎖一個(gè)明顯的缺點(diǎn)
7、是它只有兩種狀態(tài):鎖定和非鎖定。而條件變量通過(guò)允許線(xiàn)程阻塞和等待另一個(gè)線(xiàn)程發(fā)送信號(hào)的方法彌補(bǔ)了互斥鎖的不足,它常和互斥鎖一起使用。使用時(shí),條件變量被用來(lái)阻塞一個(gè)線(xiàn)程,當(dāng)條件不滿(mǎn)足時(shí),線(xiàn)程往往解開(kāi)相應(yīng)的互斥鎖并等待條件發(fā)生變化。信號(hào)量信號(hào)量既可以作為二值計(jì)數(shù)器(即0,1),也可以作為資源計(jì)數(shù)器.信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來(lái)控制對(duì)公共資源的訪(fǎng)問(wèn)。當(dāng)公共資源增加時(shí),調(diào)用函數(shù)sem_post()增加信號(hào)量。只有當(dāng)信號(hào)量值大于0時(shí),才能使用公共資源,使用后,函數(shù)sem_wait()減少信號(hào)量。函數(shù)sem_trywait()和函數(shù)pt
8、hread_mutex_trylock()起同樣的作用,它是函數(shù)sem_wait()的非阻塞版本。實(shí)驗(yàn)內(nèi)容:線(xiàn)程函數(shù)編譯時(shí)需要添加特殊編譯選項(xiàng):gcc*.c-lpthread-o1、完成教材上