日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux上线程开发API概要(线程)

發(fā)布時(shí)間:2023/12/10 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux上线程开发API概要(线程) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

進(jìn)程與線程
??????典型的UNIX/Linux進(jìn)程可以看成只有一個(gè)控制線程:一個(gè)進(jìn)程在同一時(shí)刻只做一件事情。有了多個(gè)控制線程后,在程序設(shè)計(jì)時(shí)可以把進(jìn)程設(shè)計(jì)成在同一時(shí)刻做不止一件事,每個(gè)線程各自處理獨(dú)立的任務(wù)。

?????? 進(jìn)程是程序執(zhí)行時(shí)的一個(gè)實(shí)例,是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時(shí)間、內(nèi)存等)的基本單位。在面向線程設(shè)計(jì)的系統(tǒng)中,進(jìn)程本身不是基本運(yùn)行單位,而是線程的容器。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序(那些指令和數(shù)據(jù))的真正運(yùn)行實(shí)例。
?????? “進(jìn)程——資源分配的最小單位,線程——程序執(zhí)行的最小單位”
??????一個(gè)進(jìn)程至少包含一個(gè)線程,進(jìn)程是運(yùn)行的程序,程序是靜態(tài)的概念,進(jìn)程是動(dòng)態(tài)的概念。
??????進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,可以用線程,也可以用進(jìn)程間的通信。
使用線程的理由
??????從上面我們知道了進(jìn)程與線程的區(qū)別,其實(shí)這些區(qū)別也就是我們使用線程的理由。總的來說就是:進(jìn)程有獨(dú)立的地址空間,線程沒有單獨(dú)的地址空間(同一進(jìn)程內(nèi)的線程共享進(jìn)程的地址空間)。

??????使用多線程的理由之一是和進(jìn)程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式。我們知道,在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間。據(jù)統(tǒng)計(jì),總的說來,一個(gè)進(jìn)程的開銷大約是一個(gè)線程開銷的30倍左右,當(dāng)然,在具體的系統(tǒng)上,這個(gè)數(shù)據(jù)可能會(huì)有較大的區(qū)別。

??????使用多線程的理由之二是線程間方便的通信機(jī)制。對不同進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí),而且很不方便。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。當(dāng)然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時(shí)被兩個(gè)線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災(zāi)難性的打擊,這些正是編寫多線程程序時(shí)最需要注意的地方。
Linux上線程開發(fā)API概要
??????多線程開發(fā)在 Linux 平臺(tái)上已經(jīng)有成熟的 pthread 庫支持。其涉及的多線程開發(fā)的最基本概念主要包含三點(diǎn):線程,互斥鎖,條件。其中,線程操作又分線程的創(chuàng)建,退出,等待 3 種。互斥鎖則包括 4 種操作,分別是創(chuàng)建,銷毀,加鎖和解鎖。條件操作有 5 種操作:創(chuàng)建,銷毀,觸發(fā),廣播和等待。其他的一些線程擴(kuò)展概念,如信號燈等,都可以通過上面的三個(gè)基本元素的基本操作封裝出來。詳細(xì)請見下表:
1、線程創(chuàng)建

#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); // 返回:若成功返回0,否則返回錯(cuò)誤編號 //pthread_t是無符號的長整型,第一個(gè)參數(shù)是pthread_t類型的指針, //第個(gè)二參數(shù)是線程的屬性 //第三個(gè)參數(shù)是函數(shù)指針 //最后一個(gè)參數(shù)是給線程傳參的一個(gè)參數(shù)

當(dāng)pthread_create成功返回時(shí),由tidp指向的內(nèi)存單元被設(shè)置為新創(chuàng)建線程的線程ID。attr參數(shù)用于定制各種不同的線程屬性,暫可以把它設(shè)置為NULL,以創(chuàng)建默認(rèn)屬性的線程。

新創(chuàng)建的線程從start_rtn函數(shù)的地址開始運(yùn)行,該函數(shù)只有一個(gè)無類型指針參數(shù)arg。如果需要向start_rtn函數(shù)傳遞的參數(shù)不止一個(gè),那么需要把這些參數(shù)放到一個(gè)結(jié)構(gòu)中,然后把這個(gè)結(jié)構(gòu)的地址作為arg參數(shù)傳入。
線程的退出

單個(gè)線程可以通過以下三種方式退出,在不終止整個(gè)進(jìn)程的情況下停止它的控制流:

1)線程只是從啟動(dòng)例程中返回,返回值是線程的退出碼。

2)線程可以被同一進(jìn)程中的其他線程取消。

3)線程調(diào)用pthread_exit:
pthread_exit函數(shù)

#include <pthread.h> int pthread_exit(void *rval_ptr);

rval_ptr是一個(gè)無類型指針,與傳給啟動(dòng)例程的單個(gè)參數(shù)類似。進(jìn)程中的其他線程可以通過調(diào)用pthread_join函數(shù)訪問到這個(gè)指針。
線程等待

#include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr); // 返回:若成功返回0,否則返回錯(cuò)誤編號

調(diào)用這個(gè)函數(shù)的線程將一直阻塞,直到指定的線程調(diào)用pthread_exit、從啟動(dòng)例程中返回或者被取消。如果例程只是從它的啟動(dòng)例程返回i,rval_ptr將包含返回碼。如果線程被取消,由rval_ptr指定的內(nèi)存單元就置為PTHREAD_CANCELED。

可以通過調(diào)用pthread_join自動(dòng)把線程置于分離狀態(tài),這樣資源就可以恢復(fù)。如果線程已經(jīng)處于分離狀態(tài),pthread_join調(diào)用就會(huì)失敗,返回EINVAL。

如果對線程的返回值不感興趣,可以把rval_ptr置為NULL。在這種情況下,調(diào)用pthread_join函數(shù)將等待指定的線程終止,但并不獲得線程的終止?fàn)顟B(tài)。
線程的脫離
一個(gè)線程或者是可匯合(joinable,默認(rèn)值),或者是脫離的(detached)。當(dāng)一個(gè)可匯合的線程終止時(shí),它的線程ID和退出狀態(tài)將留存到另一個(gè)線程對它調(diào)用pthread_join。脫離的線程卻像守護(hù)進(jìn)程,當(dāng)它們終止時(shí),所有相關(guān)的資源都被釋放,我們不能等待它們終止。如果一個(gè)線程需要知道另一線程什么時(shí)候終止,那就最好保持第二個(gè)線程的可匯合狀態(tài)。

pthread_detach函數(shù)把指定的線程轉(zhuǎn)變?yōu)槊撾x狀態(tài)。

#include <pthread.h> int pthread_detach(pthread_t thread); // 返回:若成功返回0,否則返回錯(cuò)誤編號

本函數(shù)通常由想讓自己脫離的線程使用,就如以下語句:

pthread_detach(pthread_self());

線程ID獲取及比較

#include <pthread.h> pthread_t pthread_self(void); // 返回:調(diào)用線程的ID

對于線程ID比較,為了可移植操作,我們不能簡單地把線程ID當(dāng)作整數(shù)來處理,因?yàn)椴煌到y(tǒng)對線程ID的定義可能不一樣。我們應(yīng)該要用下邊的函數(shù):

#include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); // 返回:若相等則返回非0值,否則返回0

對于多線程程序來說,我們往往需要對這些多線程進(jìn)行同步。同步(synchronization)是指在一定的時(shí)間內(nèi)只允許某一個(gè)線程訪問某個(gè)資源。而在此時(shí)間內(nèi),不允許其它的線程訪問該資源。我們可以通過互斥鎖(mutex),條件變量(condition variable)和讀寫鎖(reader-writer lock)來同步資源。在這里,我們暫不介紹讀寫鎖。
代碼示例

#include<stdio.h> #include<pthread.h> //int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);void*func1(void *arg) {static int ret=10;//如果不是 static 函數(shù)調(diào)用結(jié)束后 ret 的值會(huì)消失static char*p="t1 is run out";printf("t1 :%ld thread is created\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int*)arg));pthread_exit((void*)p); } int main() {int ret;int param=100;char *pret;pthread_t t1;ret=pthread_create(&t1,NULL,func1,(void*)&param);if(ret==0){printf("main:create t1 success\n");}printf("main : %ld \n",(unsigned long)pthread_self());pthread_join(t1,(void**)&pret);//這個(gè)函數(shù)用來等t1線程的退出,他是用在主線程中printf("main:t1 quite return is %s\n",pret);return 0; }

體現(xiàn)線程共享內(nèi)存空間代碼

{ #include<stdio.h> #include<pthread.h> //int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); int g_data=0;//主進(jìn)程和進(jìn)程1和進(jìn)程2都共享這一個(gè)全局變量 void*func1(void *arg) {printf("t1 :%ld thread is created\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int*)arg));while(1){printf("t1 printf is %d\n",g_data++);sleep(1);} }void*func2(void *arg) {printf("t2 :%ld thread is created\n",(unsigned long)pthread_self());printf("t2:param is %d\n",*((int*)arg));while(1){printf("t2 printf is %d\n",g_data++);sleep(1);} }int main() {int ret;int param=100;pthread_t t1;pthread_t t2;ret=pthread_create(&t1,NULL,func1,(void*)&param);if(ret==0){printf("main:create t1 success\n");}ret=pthread_create(&t2,NULL,func2,(void*)&param);if(ret==0){printf("main:create t2 success\n");}printf("main : %ld \n",(unsigned long)pthread_self());while(1){printf("main printf is %d\n",g_data++);sleep(1);}pthread_join(t1,NULL);//yong laidengdai t1 xiancheng tuichupthread_join(t2,NULL);//yong laidengdai t1 xiancheng tuichureturn 0; } //c此程序三個(gè)進(jìn)程的運(yùn)行順序沒有確定誰先誰后

總結(jié)

以上是生活随笔為你收集整理的Linux上线程开发API概要(线程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性猛交久久久久 | 成人av资源站 | 男生和女生差差的视频 | 就操网 | 男人午夜天堂 | 日日爱影视| 亚洲男人网站 | 四虎在线影视 | 日本在线第一页 | 中文字幕一区二区三区免费 | 欧美日韩亚洲在线 | 黄色麻豆视频 | 国产东北真实交换多p免视频 | 男人天堂久久 | 无码无遮挡又大又爽又黄的视频 | 日韩欧美三区 | 久久精品99国产精 | 国偷自拍| 女同性恋一区二区三区 | 国产精品免费看久久久无码 | 三级免费| 日韩欧美三级在线观看 | 国产美女主播 | 日日干日日插 | 午夜精品久久久久久毛片 | 嫩草影院菊竹影院 | 乱lun合集小可的奶水 | 少妇又色又爽又黄的视频 | 9色在线| 一级看片免费视频 | 亚洲精品资源在线 | www.成人精品| 日本不卡在线播放 | 国产精品夜色一区二区三区 | 国产成人午夜精品无码区久久 | 成人av在线看 | 亚洲国产日韩欧美在线观看 | 欧美日一区二区三区 | 日韩婷婷| 播放毛片 | 91黄色大片 | 30一40一50老女人毛片 | 中文字幕日韩精品亚洲一区小树林 | 国产九九九 | 日本五十熟hd丰满 | 国产在线天堂 | 97视频总站 | 手机看片日韩欧美 | 欧美老女人性视频 | 毛片自拍 | 大乳女喂男人吃奶 | 国产香蕉视频在线播放 | 国产资源免费 | 韩国女同性做爰三级 | 国产毛片在线 | 成人欧美精品一区二区 | 巨乳xxx| 国精品无码一区二区三区 | 男裸体无遮挡网站 | 久久久免费电影 | 国产精品久久久久久久久久久不卡 | av在线免费不卡 | 国内精品人妻无码久久久影院蜜桃 | 先锋av资源网 | 久久欧美 | 91丝袜在线观看 | 亚洲经典三级 | 日日噜噜噜噜人人爽亚洲精品 | 人妻毛片 | av久操| 日韩高清在线观看一区 | 国产成人无码性教育视频 | h视频在线观看网站 | 少妇太爽了太深了太硬了 | 精品少妇人妻av一区二区三区 | 久久久久久香蕉 | 色姑娘久 | 欧美资源在线观看 | 波多野结衣亚洲 | 国产一区视频免费观看 | 国产精品一区二区久久国产 | 国产三级一区二区三区 | 豆花视频在线播放 | 老熟妇一区二区三区啪啪 | 日韩黄色一级视频 | 女王人厕视频2ⅴk | 韩国三级做爰视频 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 丰满大乳少妇在线观看网站 | 亚洲免费av一区二区 | 欧美精品久久99 | 欧美色综合天天久久综合精品 | 日韩av在线第一页 | 日本亚洲在线 | 超碰997 | 国外av在线| 爱爱高潮视频 | а√天堂资源官网在线资源 | 久久久女人 |