C++學(xué)習(xí)之線程詳解_第1頁(yè)
C++學(xué)習(xí)之線程詳解_第2頁(yè)
C++學(xué)習(xí)之線程詳解_第3頁(yè)
C++學(xué)習(xí)之線程詳解_第4頁(yè)
C++學(xué)習(xí)之線程詳解_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C++學(xué)習(xí)之線程詳解目錄開(kāi)篇線程的狀態(tài)多線程的構(gòu)建計(jì)算時(shí)間一、程序運(yùn)行時(shí)間二、chrono共享資源和互斥鎖condition_variable線程池總結(jié)

開(kāi)篇

多線程是開(kāi)發(fā)中必不可少的,往往我們需要多個(gè)任務(wù)并行,就需要多線程開(kāi)發(fā);就好比圖像檢測(cè)和圖像結(jié)果的處理,這就是一個(gè)可閉環(huán)的任務(wù),用多線程是可以加速這個(gè)任務(wù)的;

線程的狀態(tài)

就緒態(tài):線程能夠運(yùn)行,正在等待處理機(jī)資源;

運(yùn)行態(tài):正在運(yùn)行,可能有多個(gè)線程處于運(yùn)行態(tài);

阻塞態(tài):線程由于等待某些條件而無(wú)法運(yùn)行,例如IO、鎖、互斥量等;

終止態(tài):線程從起始函數(shù)返回或被取消;

多線程的構(gòu)建

有三種方式可以構(gòu)建多線程,前提是都需要引入pthread.h這個(gè)頭文件;

1、函數(shù);

2、仿函數(shù);

3、Lambda表達(dá)式;

三者的本質(zhì)都是在調(diào)用函數(shù);

//函數(shù)方式

voidfun(strings){

coutsendl;

cout"firstthreadprogramm"sendl;

intmain(){

strings="Hellworld";

threadth=thread(fun,s);

th.join();

上面代碼為最簡(jiǎn)單線程的一個(gè)構(gòu)造;

join函數(shù)是一個(gè)等待線程完成函數(shù),主線程需要等待子線程運(yùn)行結(jié)束才可以結(jié)束;還有一個(gè)detach的函數(shù),會(huì)讓線程在后臺(tái)運(yùn)行,需要等到程序退出才結(jié)束;

計(jì)算時(shí)間

計(jì)算時(shí)間在這里介紹兩種方式:

一、程序運(yùn)行時(shí)間

longn=0;

clock_tstart,finish;

start=clock();

while(n1000000000)

n++;

finish=clock();

printf("spendtime%fs\n",(double)(finish-start)/CLOCKS_PER_SEC);

printf("spendtime%fms\n",(double)(finish-start)/1000);

這種方式和系統(tǒng)時(shí)間無(wú)關(guān),一般用來(lái)調(diào)試時(shí)打印時(shí)間;

二、chrono

#includechrono

//方式三chrono

std::chrono::system_clock::time_pointCstart=std::chrono::system_clock::now();//系統(tǒng)時(shí)間

//std::chrono::steady_clock::time_pointCstart=std::chrono::steady_clock::now();//穩(wěn)定時(shí)間

longn=0;

while(n1000000000)n++;

std::chrono::system_clock::time_pointCend=std::chrono::system_clock::now();//系統(tǒng)時(shí)間

std::chrono::durationfloatspend_time=Cend-Cstart;

coutspend_time.count()endl;

這個(gè)方式用系統(tǒng)時(shí)間進(jìn)行計(jì)算,在實(shí)際程序中用這個(gè)方式;

共享資源和互斥鎖

關(guān)于互斥鎖的概念,引用這篇博主的講解:文章

引入互斥鎖原因:當(dāng)有兩個(gè)線程共享一塊資源時(shí),容易造成沖突,也就是上個(gè)線程還沒(méi)結(jié)束就進(jìn)行下個(gè)線程,舉個(gè)例子就是讀寫操作,添加互斥鎖可以很好的解決這個(gè)沖突問(wèn)題;

互斥鎖是個(gè)簡(jiǎn)單的加鎖方法,互斥鎖只有兩種狀態(tài):上鎖(lock)和解鎖(unlock);

互斥鎖特點(diǎn):

1、原子性:把一個(gè)互斥量鎖定為一個(gè)原子操作,這意味著如果一個(gè)線程鎖定了一個(gè)互斥量,沒(méi)有其他線程在同一時(shí)間可以成功鎖定這個(gè)互斥量;

2、唯一性:如果一個(gè)線程鎖定了一個(gè)互斥量,在它解除鎖定之前,沒(méi)有其他線程可以鎖定這個(gè)互斥量;

3、非繁忙等待:如果一個(gè)線程已經(jīng)鎖定了一個(gè)互斥量,第二個(gè)線程又試圖去鎖定這個(gè)互斥量,則第二個(gè)線程將被掛起(不占用任何cpu資源),直到第一個(gè)線程解除對(duì)這個(gè)互斥量的鎖定為止,第二個(gè)線程則被喚醒并繼續(xù)執(zhí)行,同時(shí)鎖定這個(gè)互斥量。

互斥鎖的使用:

mutexmtx;//創(chuàng)建互斥鎖對(duì)象

mtx.lock();

g_pcm_elapseds.push_back(std::make_pair(pcm_data,elapsed));//執(zhí)行語(yǔ)句

mtx.unlock();

condition_variable

condition_variable條件變量可以阻塞(wait)調(diào)用的線程直到使

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論