C++ Thread

頭文件

#include <thread>             // std::thread
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable

thread

constructor

thread() noexcept;
thread( thread&& other ) noexcept;
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
thread( const thread& ) = delete;

thread 不可復(fù)制匀奏,沒有兩個(gè) std::thread 對(duì)象可表示同一執(zhí)行線程。

destructor

~thread();

Destroys the thread object.

If *this has an associated thread (joinable() == true), std::terminate() is called.

int main()
{
    {
        thread th1(t1);  // th1離開作用域析構(gòu)后,線程被終止;
        cout << std::boolalpha << th1.joinable() << endl;  // true
    }
    
    while (1);
    return 0;
}

operator=

thread& operator=( thread&& other ) noexcept;

thread 不可復(fù)制,沒有兩個(gè) std::thread 對(duì)象可表示同一執(zhí)行線程帖族。

joinable

thread::joinable() 用來判斷線程對(duì)象是否持有一個(gè)活動(dòng)的執(zhí)行線程(執(zhí)行實(shí)例)啥酱。以下情況的線程對(duì)象不持有實(shí)際線程:

  1. 缺省構(gòu)造的thread對(duì)象
std::thread t1; // t1不是線程
t1.joinable();  // false
/////////////////////////////////////////////////
void f1(int n){
    for (int i = 0; i < 2; ++i) {
        std::cout << "Thread 1 executing\n";
        ++n;
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

std::thread t2(f1, n + 1); 
t2.joinable();   // true
  1. 調(diào)用了thread::join()的對(duì)象
void t1()  //普通的函數(shù)合是,用來執(zhí)行線程
{
    for (int i = 0; i < 5; ++i)
    {
        cout << "t1111" << endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
}

int main()
{
    thread th1(t1); 
    cout << std::boolalpha << th1.joinable() << endl;  // true
    th1.join(); 
    cout << std::boolalpha << th1.joinable() << endl;;  // false
    cout << "here is main\n\n";
    while (1);
    return 0;
}
  1. 調(diào)用了thread::detach()的對(duì)象
int main()
{
    thread th1(t1); 
    cout << std::boolalpha << th1.joinable() << endl;  // true
    th1.detach(); 
    cout << std::boolalpha << th1.joinable() << endl;;  // false
    cout << "here is main\n\n";
    while (1);
    return 0;
}

join

調(diào)用該函數(shù)會(huì)阻塞當(dāng)前線程(主調(diào)線程)

阻塞調(diào)用者(caller)所在的線程(主調(diào)線程)直至被join的std::thread對(duì)象標(biāo)識(shí)的線程(被調(diào)線程執(zhí)行結(jié)束。

detach

detach是用來和線程對(duì)象分離的岔绸,這樣線程可以獨(dú)立地執(zhí)行理逊,一旦線程執(zhí)行完畢橡伞,操作系統(tǒng)分配的資源將會(huì)被釋放。不過這樣由于沒有thread對(duì)象指向該線程而失去了對(duì)它的控制晋被。

當(dāng)對(duì)象析構(gòu)時(shí)線程會(huì)繼續(xù)在后臺(tái)執(zhí)行兑徘,但是當(dāng)主程序退出時(shí)并不能保證線程能執(zhí)行完。

如果沒有良好的控制機(jī)制或者這種后臺(tái)線程比較重要羡洛,最好不用detach而應(yīng)該使用join挂脑。

swap

交換兩個(gè)線程對(duì)象所代表的底層句柄

mutex

std::mutex  mux;
mux.lock();
mux.unlock();

lock

std::lock_guard , 與Mutex RAII相關(guān),方便線程對(duì)互斥量上鎖。

std::unique_lock , 與Mutex RAII相關(guān),方便線程對(duì)互斥量上鎖卫漫,但提供了更好的上鎖和解鎖控制最住。

std::mutex  m;
std::lock_guard<mutex>  lock1(m);
std::unique_lock<mutex> lock2(m);

condition_variable

#include <iostream>
#include <thread>
#include <stdlib.h> 
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <queue>

using namespace std;

std::mutex mux;
std::condition_variable cond;
std::queue<int> q;

void producer()
{
    for (int i = 0; i < 10; ++i)
    {
        std::unique_lock<mutex> lock(mux);
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        q.push(i);
        cond.notify_one();
    }
}

void consumer()
{
    while (1)
    {
        std::unique_lock<mutex> lock(mux);
        while (q.empty())
        {
            cond.wait(lock);
        }
        cout << "consumer " << q.front() << endl;
        q.pop();
    }
}

int main()
{
    std::thread t1(producer);
    std::thread t2(consumer);
    t1.join();
    cout << "producer finished " << endl;
    t2.join();
    return 0;
}

參考文獻(xiàn)

  1. C++ thread用法總結(jié)(整理)_順其自然~的博客-CSDN博客_c++ thread
  2. c++11中的lock_guard和unique_lock使用淺析_guotianqing的博客-CSDN博客_lock_guard
  3. lock_guard和unique_lock_一葉飄落盡知秋的博客-CSDN博客
  4. C++11 條件變量(condition_variable) 使用詳解 - 小海哥哥de - 博客園 (cnblogs.com)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摄悯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖牍戚,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虑粥,居然都是意外死亡如孝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門娩贷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第晰,“玉大人,你說我怎么就攤上這事彬祖∽率荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵储笑,是天一觀的道長腹躁。 經(jīng)常有香客問我,道長南蓬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任哑了,我火速辦了婚禮赘方,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弱左。我一直安慰自己窄陡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布拆火。 她就那樣靜靜地躺著跳夭,像睡著了一般涂圆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上币叹,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天润歉,我揣著相機(jī)與錄音,去河邊找鬼颈抚。 笑死踩衩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贩汉。 我是一名探鬼主播驱富,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼匹舞!你這毒婦竟也來了褐鸥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赐稽,失蹤者是張志新(化名)和其女友劉穎叫榕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體又憨,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翠霍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蠢莺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寒匙。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躏将,靈堂內(nèi)的尸體忽然破棺而出锄弱,到底是詐尸還是另有隱情,我是刑警寧澤祸憋,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布会宪,位于F島的核電站,受9級(jí)特大地震影響蚯窥,放射性物質(zhì)發(fā)生泄漏掸鹅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一拦赠、第九天 我趴在偏房一處隱蔽的房頂上張望巍沙。 院中可真熱鬧,春花似錦荷鼠、人聲如沸句携。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矮嫉。三九已至削咆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蠢笋,已是汗流浹背拨齐。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挺尿,地道東北人奏黑。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像编矾,于是被迫代替她去往敵國和親熟史。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 什么是C++多線程并發(fā)窄俏? 線程:線程是操作系統(tǒng)能夠進(jìn)行CPU調(diào)度的最小單位蹂匹,它被包含在進(jìn)程之中,一個(gè)進(jìn)程可包含單個(gè)...
    詩人和酒閱讀 1,665評(píng)論 0 9
  • 主要參考:Advanced Operating Systems-Multi-threading in C++ fr...
    啊呀喲嘿閱讀 1,413評(píng)論 0 0
  • 前言 C++中在以往版本中不支持線程凹蜈。需要使用pthread之類的使用線程限寞。如果能夠使用C++自身的線程則可以使程...
    linanwx閱讀 3,513評(píng)論 0 4
  • 參考cplusplus參考cppreference 0.線程的基礎(chǔ)知識(shí) 0.1 線程的狀態(tài) 0.2 c++線程的j...
    王偵閱讀 4,366評(píng)論 0 0
  • 為什么需要detach?一言以概之:一般不需要使用仰坦,推薦使用join履植,當(dāng)且僅當(dāng)你需要快速回收線程資源的時(shí)候可以使用...
    Brent姜閱讀 4,175評(píng)論 0 1