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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux:线程

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

一、進(jìn)程與線程的區(qū)別

?????????????????典型的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í)行的最小單位"

???????? ? ? ?進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(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ī)制。

????????????????對(duì)不同進(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 上關(guān)于線程的API

?????? 多線程開發(fā)在 Linux 平臺(tái)上已經(jīng)有成熟的 pthread 庫支持。? (編譯的時(shí)候需要 -lpthread)

??????????????????????其涉及的多線程開發(fā)的最基本概念主要包含三點(diǎn):線程,互斥鎖,條件。

????????????????????其中,線程操作又分線程的創(chuàng)建,退出,等待 3 種。????????

????????????????????????????????互斥鎖則包括 4 種操作,分別是創(chuàng)建,銷毀,加鎖和解鎖。

????????????????????????????????條件操作有 5 種操作:創(chuàng)建,銷毀,觸發(fā),廣播和等待。

????????????????????????????????其他的一些線程擴(kuò)展概念,如信號(hào)燈等,都可以通過上面的三個(gè)基本元素的基本操作封裝出來。詳細(xì)請(qǐng)見下表:  

三、線程的創(chuàng)建,退出,等待

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ò)誤編號(hào)

????????

????????pthread_create:函數(shù)名

?

????????第一個(gè)參數(shù)是一個(gè)指針? ? ,指向一個(gè)pthread_t 的指針,在頭文件中聲明pthread_t是一個(gè)無符號(hào)的長整型,是一個(gè)長整型的指針

第二個(gè)是線程的屬性

第三個(gè)是線程,這是一個(gè)函數(shù)指針,調(diào)用相關(guān)的函數(shù)

第四個(gè),是給這個(gè)線程傳參的參數(shù),因?yàn)樗且粋€(gè)無類型的指針,可以傳基本的變量類型int ,char ,也可以傳數(shù)組,也可以傳結(jié)構(gòu)體,只要是個(gè)地址就可以啦

????

????????????????當(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ù)傳入。

?

 2. 線程退出

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

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

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

  3)線程調(diào)用pthread_exit:

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

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

線程退出的時(shí)候返回值可以是整數(shù)呀,char 型,可以是數(shù)組,可以是字符串


線程的退出調(diào)用pthread_exit


3、線程等待
?


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

 ???????? 調(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。

 ???????? 如果對(duì)線程的返回值不感興趣,可以把rval_ptr置為NULL。????????

????????????????在這種情況下,調(diào)用pthread_join函數(shù)將等待指定的線程終止,但并不獲得線程的終止?fàn)顟B(tài)

線程等待調(diào)用pthread_join

join和exit可以配合用,join可以回收exit退出的返回值(void *rval_ptr)

補(bǔ)充:線程ID獲取及比較

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

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

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

4、相關(guān)的代碼的實(shí)現(xiàn)

這個(gè)線程做什么呢?

打印這個(gè)線程的id 號(hào),調(diào)用pthread_self()

創(chuàng)建的話有四個(gè)參數(shù),

第一個(gè)參數(shù)是一個(gè)指針,指向那個(gè)t1

第二個(gè)是線程屬性,寫NULL

第三個(gè)啟動(dòng)這個(gè)線程需要調(diào)動(dòng)哪些函數(shù),(這里面調(diào)用func1這個(gè)函數(shù))

第四個(gè)參數(shù),我們打印了param

我們可以再把param做出來,

把a(bǔ)rg轉(zhuǎn)化成int 型的指針,再對(duì)這個(gè)指針取數(shù)據(jù)(先把void * 型改成int *型,再把int *型里面的內(nèi)容,用取內(nèi)容的符號(hào)取出來)

?

?記得編譯的時(shí)候要加上pthread

?結(jié)果如下,但是缺了一句話,那么原因是什么呢?

原因是:

main 這個(gè)主線程創(chuàng)建第二個(gè)線程的時(shí)候呢,ret = pthread_create(&t1,NULL,func1,(void *)&param);
?

一但線程起來的時(shí)候?printf("%ld thread is create\n",(unsigned long)pthread_self());就在跑了,跑到一半的時(shí)候發(fā)現(xiàn)main 函數(shù)退出了

導(dǎo)致他來不及執(zhí)行第二句話
?

????????

有一種方式

不讓主線程退出不就得了

再來打印一下主線程的id號(hào)

為什么會(huì)多打一個(gè)thread is create?

?改動(dòng)一下

結(jié)果

?我想看的再清晰一點(diǎn):

這樣就知道誰打印的啦

先進(jìn)入main函數(shù),main函數(shù)創(chuàng)建成功,main函數(shù)把他自己的控制線程的id打印出來

接著輪到新線程運(yùn)行,新線程得到的參數(shù)是100

如果把while(1)去掉呢?

有可能主要的線程已經(jīng)退出了,你的新線程還來不及執(zhí)行就沒了

程序一但退出,主的線程一但退出,代表整個(gè)地址空間就釋放了,那么t1新線程沒有任何的地址空間給他操作,所以我們看不到任何t1線程的操作

必須用while(1)這么土的辦法嗎?

可以換成pthread_join

?thread是一個(gè)變量,不是一個(gè)指針

第二個(gè)是回收線程的退出狀態(tài)

?先用NULL不收回退出狀態(tài)

它也會(huì)讓t1執(zhí)行完,主線程再退出

join可以回收線程退出的狀態(tài)

線程等待的第二個(gè)參數(shù)是一個(gè)二級(jí)指針

我退出的是ret 的值

這個(gè)exit調(diào)用的是一個(gè)無類型的void * 的一個(gè)一級(jí)指針

我們定義一個(gè) int *pret

傳的是二級(jí)指針過去,那這個(gè)pret指向誰呀?指向static int ret =10;

所以我們調(diào)用static, 函數(shù)調(diào)用以后數(shù)據(jù)還在,如果不用static的話,函數(shù)調(diào)用一結(jié)束,這個(gè)數(shù)就會(huì)消失,那么指向它的內(nèi)存就無效

?

上面是返回一個(gè)整數(shù),那我們可不可以返會(huì)一個(gè)字符串呢?

P是個(gè)一級(jí)指針,轉(zhuǎn)化成void *型

訪問的時(shí)候也一樣,用char *pret = NULL;

再把二級(jí)指針傳過去

最終調(diào)用字符串,字符串用一級(jí)指針訪問

?不管什么類型的都不能忽略static,如果去掉的話

結(jié)果的ret 就不是10 了,是隨機(jī)給你分配的數(shù)據(jù)

因?yàn)槲业亩?jí)指針是指向ret =10 的,如果不用static函數(shù)一調(diào)用,ret 就沒掉了

(補(bǔ)充:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

傳參的時(shí)候你可以傳遞一個(gè)整型數(shù),也可以傳遞一個(gè)結(jié)構(gòu)體,

當(dāng)你傳遞一個(gè)變量的時(shí)候,你用一個(gè)整形或者char型就可以了

當(dāng)你傳遞多個(gè)數(shù)據(jù)的時(shí)候,create 第四個(gè)參數(shù)設(shè)置成一個(gè)結(jié)構(gòu)體

四、線程共享內(nèi)存空間的代碼驗(yàn)證

驗(yàn)證:線程共享進(jìn)程的內(nèi)存空間

?他們的執(zhí)行順序不一定都是這種順序

?他們線程之間是有競(jìng)爭(zhēng)的關(guān)系

?

然后我們來看一下共享的使用

?

運(yùn)行的結(jié)果

他們的書是沒有重復(fù)的,說明他們?cè)L問的是同一個(gè)變量

所以說多個(gè)線程共享數(shù)據(jù)段里面的數(shù)據(jù)

所以說線程共享進(jìn)程的內(nèi)存空間

?而且它得到的數(shù)都是隨機(jī)的

?對(duì)比一下

?

這樣寫的話會(huì)導(dǎo)致一個(gè)問題:

?有時(shí)候的線程1不一定會(huì)退出

?五、線程同步之互斥量加鎖解鎖

? ????????????????互斥量(mutex)從本質(zhì)上來說是一把鎖,在訪問共享資源前對(duì)互斥量進(jìn)行加鎖,在訪問完成后釋放互斥量上的鎖。

????????????????對(duì)互斥量進(jìn)行加鎖后,任何其他試圖再次對(duì)互斥量加鎖的線程將會(huì)被阻塞直到當(dāng)前線程釋放該互斥鎖。????????

????????????????如果釋放互斥鎖時(shí)有多個(gè)線程阻塞,所有在該互斥鎖上的阻塞線程都會(huì)變成可運(yùn)行狀態(tài),第一個(gè)變?yōu)榭蛇\(yùn)行狀態(tài)的線程可以對(duì)互斥量加鎖,其他線程將會(huì)看到互斥鎖依然被鎖住,只能回去等待它重新變?yōu)榭捎谩T谶@種方式下,每次只有一個(gè)線程可以向前運(yùn)行。

??????????????????????如果釋放互斥鎖時(shí)有多個(gè)線程阻塞,所有在該互斥鎖上的阻塞線程都會(huì)變成可運(yùn)行狀態(tài),第一個(gè)變?yōu)榭蛇\(yùn)行狀態(tài)的線程可以對(duì)互斥量加鎖,其他線程將會(huì)看到互斥鎖依然被鎖住,只能回去等待它重新變?yōu)榭捎谩T谶@種方式下,每次只有一個(gè)線程可以向前運(yùn)行。

????????????????在設(shè)計(jì)時(shí)需要規(guī)定所有的線程必須遵守相同的數(shù)據(jù)訪問規(guī)則。????????

????????????????只有這樣,互斥機(jī)制才能正常工作。操作系統(tǒng)并不會(huì)做數(shù)據(jù)訪問的串行化。

????????????????如果允許其中的某個(gè)線程在沒有得到鎖的情況下也可以訪問共享資源,那么即使其它的線程在使用共享資源前都獲取了鎖,也還是會(huì)出現(xiàn)數(shù)據(jù)不一致的問題

?這里有錯(cuò)誤:銷毀鎖,加鎖,解鎖應(yīng)該都是指針

?這里有錯(cuò)誤:銷毀鎖,加鎖,解鎖應(yīng)該都是指針?

這里有錯(cuò)誤:銷毀鎖,加鎖,解鎖應(yīng)該都是指針

我們可以理解下文的g_data為互斥量

?運(yùn)行的時(shí)候不一定誰在前,誰在后

能不能改成先讓t1運(yùn)行,t2 在運(yùn)行呢?

先定義一個(gè)鎖(被鎖鎖住的代碼,都叫互斥量),

這個(gè)鎖是一個(gè)全局的變量,也就是說線程1和線程2都能看到這把鎖

創(chuàng)建鎖和銷毀鎖

第一個(gè)參數(shù)就是一個(gè)指針,指針就是地址

第二個(gè)參數(shù)是鎖的屬性

#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t *mutex); // 返回:若成功返回0,否則返回錯(cuò)誤編號(hào)

?

運(yùn)行結(jié)果

只能確保t1運(yùn)行完,t2在運(yùn)行

或者t2運(yùn)行完,t1在運(yùn)行

(main這個(gè)線程我們沒有控制它的)

我們可以再修改一下代碼,看一下

運(yùn)行結(jié)果

t1里面不管多少都先得執(zhí)行完畢

鎖的作用呢?一但我們獲得這個(gè)鎖,肯定保證里面的鎖執(zhí)行完畢,其他的線程才能繼續(xù)走

?我們?cè)傩薷囊幌?#xff0c;再加上一個(gè)線程

?

t1可能被main打斷,但是不會(huì)被t2和t3 打斷,t1結(jié)束后,t2和t3再來競(jìng)爭(zhēng)

或者相反,但是t1不可能被t2和t3打斷

?

6、互斥鎖限制共享資源的訪問

上面的demo4.c 想實(shí)現(xiàn)讓線程1 先運(yùn)行,當(dāng)g_data 為3的時(shí)候讓他退出

但是我們發(fā)現(xiàn)等于3的時(shí)候,不一定在線程1里面,也有可能在線程2,也有可能在main線程里面

(給這把鎖取名mutex)

就算func2先得到這把鎖,但是睡眠的那一秒。func1就能競(jìng)爭(zhēng)到鎖,

func1競(jìng)爭(zhēng)到鎖的時(shí)候,不斷檢測(cè)g_data是否到達(dá)了3,到3才解鎖,否則不解鎖

?

運(yùn)行的結(jié)果,

?運(yùn)行的結(jié)果,

?

那么t1能不能讓整個(gè)進(jìn)程退出呢?

修改一下代碼

運(yùn)行的結(jié)果,

因?yàn)檫M(jìn)程是線程的容器,線程崩了,整個(gè)進(jìn)程也會(huì)崩

線程調(diào)用exit能把整個(gè)進(jìn)程結(jié)束掉

?運(yùn)行的結(jié)果,

做一個(gè)測(cè)試,g_data=3的這件事,t1一定能競(jìng)爭(zhēng)到的

寫個(gè)腳本

?里面的內(nèi)容

相關(guān)的指令

?運(yùn)行的結(jié)果

運(yùn)行了三遍

還有一種方法

?運(yùn)行結(jié)果

按ctrl +c發(fā)現(xiàn)退不了,那就只能殺死它

ps -aux |grep a.out

查到a.out的進(jìn)程a.out

?發(fā)現(xiàn)停止了

這節(jié)課的 思路:線程1 ,while(1)里面呢,不斷對(duì)全局變量做出訪問,并做一些打印判斷等等

?

?

?七、什么情況造成死鎖

(有兩個(gè)鎖,當(dāng)線程A獲得一把鎖時(shí),想要獲得另一把鎖,同時(shí)線程B獲得線程A想要的那把鎖,想得到線程A得到的那把鎖時(shí),導(dǎo)致線程A和線程B都想拿到對(duì)方手里有的那把鎖,誰都不肯解鎖,會(huì)造成死鎖)

線程1 拿著鎖1 ,想要獲得鎖2

線程2 拿著鎖2 ,想要獲得鎖1

對(duì)于線程1 來說永遠(yuǎn)拿不到鎖2 ,因?yàn)殒i2 已經(jīng)被線程2 拿走了

對(duì)于線程2 來說 永遠(yuǎn)拿不到鎖1,因?yàn)殒i1 已經(jīng)被線程1 拿走了

這樣線程1 就會(huì)卡死想拿到鎖2 的地方

線程2 就會(huì)卡死在想拿到鎖1 的的地方

大家誰都拿不到另外一把鎖,導(dǎo)致造成死鎖,大家都在休眠等待

?

?

?運(yùn)行的結(jié)果

t1和t2 都沒辦法運(yùn)行下去

?這樣的情況是因?yàn)閠3 先運(yùn)行了

?

八、線程條件控制實(shí)現(xiàn)線程的同步

在前幾節(jié)

在訪問共享資源,臨界資源的時(shí)候,涉及互斥鎖

觸發(fā)和廣播的區(qū)別是

觸發(fā)發(fā)送一條,

廣播是發(fā)送廣播以后,接收者有很多個(gè)

?2.等待

#include <pthread.h> int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); 一個(gè)是條件,一個(gè)是鎖int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,cond struct timespec *restrict timeout); // 返回:若成功返回0,否則返回錯(cuò)誤編號(hào)

?

 1. 創(chuàng)建及銷毀條件變量

#include <pthread.h> int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); (一個(gè)是條件,一個(gè)是狀態(tài)) int pthread_cond_destroy(pthread_cond_t cond); // 返回:若成功返回0,否則返回錯(cuò)誤編號(hào)

?3. 觸發(fā)

#include <pthread.h> int pthread_cond_signal(pthread_cond_t *cond); (都是指針) int pthread_cond_broadcast(pthread_cond_t *cond); // 返回:若成功返回0,否則返回錯(cuò)誤編號(hào)

?現(xiàn)在我們想實(shí)現(xiàn);

讓其他線程對(duì)全局變量的值做改變,

線程1 做判斷,全局變量加到3的時(shí)候,

線程1 才做出變化,否則一直休眠,等待被喚醒

效果是線程二執(zhí)行 0,1,2,? 出現(xiàn)3的時(shí)候給線程一發(fā)信號(hào),?線程一執(zhí)行一次

?

?

?

運(yùn)行的結(jié)果

?

九、測(cè)試結(jié)果怎么辦呢?

?

?

?

?再寫一個(gè)測(cè)試文件

?

?

運(yùn)行結(jié)果十次,把運(yùn)行的結(jié)果追加到? ?test.ret.txt里面,

你會(huì)發(fā)現(xiàn)程序卡在這里

?

?

我們可以加一個(gè)取地址符號(hào),就可以再背后運(yùn)行

?

?

打開test.ret.txt

10、 補(bǔ)充:

pthread_cond_t cond;?
//動(dòng)態(tài)初始化: pthread_cond_init(&cond, NULL);
//靜態(tài)初始化: pthread_cond_t = PTHREAD_COND_INITIALIZER;

pthread_mutex_t;
//動(dòng)態(tài)初始化: pthread_mutex_init(&mutex,NULL);
//靜態(tài)初始化: pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER;

然后main函數(shù)里面的初始化就可以注釋掉

用宏的話是靜態(tài)初始化

?

?

?

總結(jié)

以上是生活随笔為你收集整理的linux:线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 特级西西444www大精品视频免费看 | 久久久久久久偷拍 | 麻豆md0049免费 | 777777av | 麻豆蜜桃av | 国产麻豆剧果冻传媒白晶晶 | 精品国产乱码久久久人妻 | 天天色综合图片 | 成年网站在线 | 男生裸体视频网站 | 日本久久精品 | 日韩电影福利 | 在线免费观看日韩视频 | jizz日本在线观看 | 色偷偷综合 | 成人网站免费观看 | 国产让女高潮的av毛片 | 国产精品搬运 | 九九视频在线播放 | 免费看毛片网站 | 亚洲在线看片 | 国产精视频 | 爱爱小视频网站 | 韩日一区 | 日韩免费a | 毛片库| 欧美一级性生活 | 99自拍偷拍 | 又黄又爽又刺激的视频 | 日本黄频 | 黄色成人免费观看 | 岛国大片在线 | 91天天色 | 欧美亚洲综合在线 | 亚洲影音先锋 | 直接看的毛片 | 久久亚洲综合国产精品99麻豆精品福利 | 在线看污片 | 精品夜夜澡人妻无码av | 国产精品999在线观看 | 久久爱一区二区 | 无码一区二区波多野结衣播放搜索 | 国产91在线视频观看 | 欧美日韩一区二区三区在线播放 | av片在线观看 | 黑人巨大精品欧美黑寡妇 | 北条麻纪在线观看aⅴ | 交专区videossex农村 | 日本一区视频 | 香蕉人妻av久久久久天天 | 天天看天天色 | 漂亮人妻被中出中文字幕 | 人操人人 | 国产一级一片 | 亚洲人在线播放 | jizzjizz国产 | 少妇h视频 | 亚洲一区二区三区午夜 | 中文字幕啪啪 | 18无套直看片红桃 | 久久动态图 | 国产区视频在线 | 国产精品探花一区二区在线观看 | 思思在线视频 | 这里只有久久精品 | 国产精品自产拍高潮在线观看 | 精品少妇3p | 国产性生活毛片 | 欧美色香蕉 | 免费手机av | 97小视频 | 美女户外露出 | 国产一区二区播放 | 婷婷色吧| 日韩女人性猛交 | 精品亚洲aⅴ无码一区二区三区 | 最新高清无码专区 | 国产不卡一二三 | 亚洲av无码一区二区三区在线观看 | 青青草成人影视 | 欧美三级视频在线播放 | 一级片毛片| 黄色一集片| 九草在线观看 | 美女被娇喘流出白 | 老熟妇精品一区二区三区 | 精品黑人一区二区三区 | 极品白嫩的小少妇 | 欧美视频一区在线观看 | 久草免费在线视频 | 成人国产精品久久久网站 | 亚洲高清av在线 | 91影院在线免费观看 | 国产尤物精品 | 麻豆传媒在线 | 韩国成人在线 | 性生交大片免费看 | 久久精品一区二区三区黑人印度 | 一区二区三区免费观看视频 |