欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++ thread用法總結(jié)

 更新時(shí)間:2020年07月23日 09:59:28   作者:sevencheng798  
這篇文章主要介紹了詳解C++ thread用法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1,簡介

C++11中加入了<thread>頭文件,此頭文件主要聲明了std::thread線程類。C++11的標(biāo)準(zhǔn)類std::thread對線程進(jìn)行了封裝,定義了C++11標(biāo)準(zhǔn)中的一些表示線程的類、用于互斥訪問的類與方法等。應(yīng)用C++11中的std::thread便于多線程程序的移值。

std::thread類成員函數(shù):

(1)、get_id:獲取線程ID,返回一個(gè)類型為std::thread::id的對象。

(2)、joinable:檢查線程是否可被join。檢查thread對象是否標(biāo)識一個(gè)活動(dòng)(active)的可行性線程。缺省構(gòu)造的thread對象、已經(jīng)完成join的thread對象、已經(jīng)detach的thread對象都不是joinable。

(3)、join:調(diào)用該函數(shù)會(huì)阻塞當(dāng)前線程。阻塞調(diào)用者(caller)所在的線程直至被join的std::thread對象標(biāo)識的線程執(zhí)行結(jié)束。

(4)、detach:將當(dāng)前線程對象所代表的執(zhí)行實(shí)例與該線程對象分離,使得線程的執(zhí)行可以單獨(dú)進(jìn)行。一旦線程執(zhí)行完畢,它所分配的資源將會(huì)被釋放。

(5)、native_handle:該函數(shù)返回與std::thread具體實(shí)現(xiàn)相關(guān)的線程句柄。native_handle_type是連接thread類和操作系統(tǒng)SDK API之間的橋梁,如在Linux g++(libstdc++)里,native_handle_type其實(shí)就是pthread里面的pthread_t類型,當(dāng)thread類的功能不能滿足我們的要求的時(shí)候(比如改變某個(gè)線程的優(yōu)先級),可以通過thread類實(shí)例的native_handle()返回值作為參數(shù)來調(diào)用相關(guān)的pthread函數(shù)達(dá)到目錄。This member function is only present in class thread if the library implementation supports it. If present, it returns a value used to access implementation-specific information associated to the thread.

(6)、swap:交換兩個(gè)線程對象所代表的底層句柄。

(7)、operator=:moves the thread object

(8)、hardware_concurrency:靜態(tài)成員函數(shù),返回當(dāng)前計(jì)算機(jī)最大的硬件并發(fā)線程數(shù)目。基本上可以視為處理器的核心數(shù)目。

另外,std::thread::id表示線程ID,定義了在運(yùn)行時(shí)操作系統(tǒng)內(nèi)唯一能夠標(biāo)識該線程的標(biāo)識符,同時(shí)其值還能指示所標(biāo)識的線程的狀態(tài)。Values of this type are returned by thread::get_id and this_thread::get_id to identify threads.

有時(shí)候我們需要在線程執(zhí)行代碼里面對當(dāng)前調(diào)用者線程進(jìn)行操作,針對這種情況,C++11里面專門定義了一個(gè)命名空間this_thread,此命名空間也聲明在<thread>頭文件中,其中包括get_id()函數(shù)用來獲取當(dāng)前調(diào)用者線程的ID;yield()函數(shù)可以用來將調(diào)用者線程跳出運(yùn)行狀態(tài),重新交給操作系統(tǒng)進(jìn)行調(diào)度,即當(dāng)前線程放棄執(zhí)行,操作系統(tǒng)調(diào)度另一線程繼續(xù)執(zhí)行;sleep_until()函數(shù)是將線程休眠至某個(gè)指定的時(shí)刻(time point),該線程才被重新喚醒;sleep_for()函數(shù)是將線程休眠某個(gè)指定的時(shí)間片(time span),該線程才被重新喚醒,不過由于線程調(diào)度等原因,實(shí)際休眠實(shí)際可能比sleep_duration所表示的時(shí)間片更長。

1.創(chuàng)建一個(gè)線程

創(chuàng)建線程比較簡單,使用std的thread實(shí)例化一個(gè)線程對象就創(chuàng)建完成了,示例:

#include <iostream>
#include <thread>
#include <stdlib.h> //sleep
 
using namespace std;
 
void t1() //普通的函數(shù),用來執(zhí)行線程
{
  for (int i = 0; i < 10; ++i)
  {
    cout << "t1111\n";
    sleep(1);
  }
}
void t2()
{
  for (int i = 0; i < 20; ++i)
  {
    cout << "t22222\n";
    sleep(1);
  }
}
int main()
{
  thread th1(t1); //實(shí)例化一個(gè)線程對象th1,使用函數(shù)t1構(gòu)造,然后該線程就開始執(zhí)行了(t1())
  thread th2(t2);
 
  th1.join(); // 必須將線程join或者detach 等待子線程結(jié)束主進(jìn)程才可以退出
  th2.join(); 
 
  //or use detach
  //th1.detach();
  //th2.detach();
 
  cout << "here is main\n\n";
 
  return 0;
}

上述提到的問題,還可以使用detach來解決,detach是用來和線程對象分離的,這樣線程可以獨(dú)立地執(zhí)行,不過這樣由于沒有thread對象指向該線程而失去了對它的控制,當(dāng)對象析構(gòu)時(shí)線程會(huì)繼續(xù)在后臺(tái)執(zhí)行,但是當(dāng)主程序退出時(shí)并不能保證線程能執(zhí)行完。如果沒有良好的控制機(jī)制或者這種后臺(tái)線程比較重要,最好不用detach而應(yīng)該使用join。

2, mutex和std::lock_guard的使用

頭文件是#include <mutex>,mutex是用來保證線程同步的,防止不同的線程同時(shí)操作同一個(gè)共享數(shù)據(jù)。

但使用lock_guard則相對安全,它是基于作用域的,能夠自解鎖,當(dāng)該對象創(chuàng)建時(shí),它會(huì)像m.lock()一樣獲得互斥鎖,當(dāng)生命周期結(jié)束時(shí),它會(huì)自動(dòng)析構(gòu)(unlock),不會(huì)因?yàn)槟硞€(gè)線程異常退出而影響其他線程。示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <stdlib.h>
 
int cnt = 20;
std::mutex m;
void t1()
{
  while (cnt > 0)
  {  
    std::lock_guard<std::mutex> lockGuard(m);
    // std::m.lock();
    if (cnt > 0)
    {
      //sleep(1);
      --cnt;
      std::cout << cnt << std::endl;
    }
    // std::m.unlock();
    
  }
}
void t2()
{
  while (cnt > 0)
  {
    std::lock_guard<std::mutex> lockGuard(m);
    // std::m.lock();
    if (cnt > 0)
    {
      --cnt;
      std::cout << cnt << std::endl;
    }
    // std::m.unlock();
  }
}
 
int main(void)
{
 std::thread th1(t1);
 std::thread th2(t2);
 
 th1.join();  //等待t1退出
 th2.join();  //等待t2退出
 
 std::cout << "here is the main()" << std::endl;
 
 return 0;
}

輸出結(jié)果,cnt是依次遞減的,沒有因?yàn)槎嗑€程而打亂次序::

19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
here is the main()

到此這篇關(guān)于詳解C++ thread用法總結(jié)的文章就介紹到這了,更多相關(guān)C++ thread內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Clion(CMake工具)中引入第三方庫的詳細(xì)方法

    Clion(CMake工具)中引入第三方庫的詳細(xì)方法

    這篇文章主要介紹了Clion(CMake工具)中引入第三方庫的詳細(xì)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì)

    C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt物聯(lián)網(wǎng)管理平臺(tái)之實(shí)現(xiàn)告警短信轉(zhuǎn)發(fā)

    Qt物聯(lián)網(wǎng)管理平臺(tái)之實(shí)現(xiàn)告警短信轉(zhuǎn)發(fā)

    系統(tǒng)在運(yùn)行過程中,會(huì)實(shí)時(shí)采集設(shè)備的數(shù)據(jù),當(dāng)采集到的數(shù)據(jù)發(fā)生報(bào)警后,可以將報(bào)警信息以短信的形式發(fā)送給指定的管理員。本文將利用Qt實(shí)現(xiàn)告警短信轉(zhuǎn)發(fā),感興趣的可以嘗試一下
    2022-07-07
  • C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用

    C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用

    strcpy和memcpy都是標(biāo)準(zhǔn)C庫函數(shù),strcpy提供了字符串的復(fù)制而memcpy提供了一般內(nèi)存的復(fù)制。下面通過本文重點(diǎn)給大家介紹C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用,非常不錯(cuò),感興趣的朋友一起看下吧
    2016-08-08
  • C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ 詳細(xì)講解對象的構(gòu)造順序

    C++ 詳細(xì)講解對象的構(gòu)造順序

    對象的構(gòu)造往往和構(gòu)造函數(shù)會(huì)牽扯在一起,構(gòu)造函數(shù)的函數(shù)可能會(huì)由非常復(fù)雜的邏輯所組成,不同類的構(gòu)造函數(shù)的程序邏輯很可能是相互依賴的,當(dāng)這種相互依賴一旦成立,那么對象的構(gòu)造順序很可能導(dǎo)致難以調(diào)試的Bug出現(xiàn)
    2022-04-04
  • C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)

    C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)

    這篇文章主要介紹了C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++實(shí)現(xiàn)歌手比賽評分系統(tǒng)

    C++實(shí)現(xiàn)歌手比賽評分系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)歌手比賽評分系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言修煉之路靈根孕育源流出?初識C言大道生下篇

    C語言修煉之路靈根孕育源流出?初識C言大道生下篇

    C語言是一門面向過程、抽象化的通用程序設(shè)計(jì)語言,廣泛應(yīng)用于底層開發(fā)。C語言能以簡易的方式編譯、處理低級存儲(chǔ)器。C語言是僅產(chǎn)生少量的機(jī)器語言以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的高效率程序設(shè)計(jì)語言
    2022-03-03
  • C語言單雙線性及循環(huán)鏈表與實(shí)例

    C語言單雙線性及循環(huán)鏈表與實(shí)例

    這篇文章主要介紹了C語言的單鏈表、雙鏈表和循環(huán)鏈表,還有一些相關(guān)的實(shí)例,感興趣的同學(xué)可以借鑒一下
    2023-03-03

最新評論