最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳解

 更新時間:2024年09月17日 10:32:57   作者:robot2017  
本文介紹了std::condition_variable和std::future在C++中的應(yīng)用,用于線程間的同步和異步執(zhí)行,通過示例代碼,展示了如何使用std::condition_variable的wait和notify接口進行線程間同步

std::condition_variable

條件變量std::condition_variable有wait和notify接口用于線程間的同步。如下圖所示,Thread 2阻塞在wait接口,Thread 1通過notify接口通知Thread 2繼續(xù)執(zhí)行。

具體參見示例代碼:

#include<iostream>
#include<mutex>
#include<thread>
#include<queue>
std::mutex mt;
std::queue<int> data;
std::condition_variable cv;
auto start=std::chrono::high_resolution_clock::now();
void logCurrentTime()
{
	auto end = std::chrono::high_resolution_clock::now();
	auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
	std::cout << elapsed << ":";
}
void prepare_data()
{	
	logCurrentTime();
	std::cout << "this is " << __FUNCTION__ << " thread:" << std::this_thread::get_id() << std::endl;
	for (int i = 0; i < 10; i++)
	{
		data.push(i);
		logCurrentTime();
		std::cout << "data OK:" << i << std::endl;
	}
	//start to notify consume_data thread data is OK!
	cv.notify_one();
}
void consume_data()
{
	logCurrentTime();
	std::cout << "this is: " << __FUNCTION__ << " thread:" << std::this_thread::get_id() << std::endl;
	std::unique_lock<std::mutex> lk(mt);
	//wait first for notification
	cv.wait(lk);  //it must accept a unique_lock parameter to wait
	while (!data.empty())
	{
		logCurrentTime();
		std::cout << "data consumed: " << data.front() << std::endl;
		data.pop();
	}
}
int main()
{
	std::thread t2(consume_data);
	//wait for a while to wait first then prepare data,otherwise stuck on wait
	std::this_thread::sleep_for(std::chrono::milliseconds(10));
	std::thread t1(prepare_data);
	t1.join();
	t2.join();
	return 0;
}

分析

主線程中另啟兩個線程,分別執(zhí)行consume_data和prepare_data,其中consume_data要先執(zhí)行,以保證先等待再通知,否則若先通知再等待就死鎖了。首先consume_data線程在從wait 處阻塞等待。后prepare_data線程中依次向隊列寫入0-10,寫完之后通過notify_one 通知consume_data線程解除阻塞,依次讀取0-10。

std::future

std::future與std::async配合異步執(zhí)行代碼,再通過wait或get接口阻塞當前線程等待結(jié)果。如下圖所示,Thread 2中future接口的get或wait接口會阻塞當前線程,std::async異步開啟的新線程Thread1執(zhí)行結(jié)束后,將結(jié)果存于std::future后通知Thread 1獲取結(jié)果后繼續(xù)執(zhí)行.

具體參見如下代碼:

#include <iostream>
#include <future>
#include<thread>
int test()
{
	std::cout << "this is " << __FUNCTION__ << " thread:" << std::this_thread::get_id() << std::endl;;
	std::this_thread::sleep_for(std::chrono::microseconds(1000));
	return 10;
}
int main()
{
	std::cout << "this is " <<__FUNCTION__<<" thread:" << std::this_thread::get_id() << std::endl;;
	//this will lanuch on another thread
	std::future<int> result = std::async(test);
	std::cout << "After lanuch a thread: "<< std::this_thread::get_id() << std::endl;
	//block the thread and wait for the result
	std::cout << "result is: " <<result.get()<< std::endl;
	std::cout << "After get result "<< std::endl;
	return 0;
}

輸出結(jié)果

分析主程序中調(diào)用std::async異步調(diào)用test函數(shù),可以看到main函數(shù)的線程ID 27428與test函數(shù)執(zhí)行的線程ID 9704并不一樣,說明std::async另起了一個新的線程。在test線程中,先sleep 1000ms,所以可以看到"After lanuch a thread:"先輸出,說明主線程異步執(zhí)行,不受子線程影響。而"After get result "最后輸出,說明get()方法會阻塞主線程,直到獲取結(jié)果。

作者:robot2017
出處:https://www.cnblogs.com/stephen2023/p/18416810
版權(quán):本文版權(quán)歸作者和博客園共有
轉(zhuǎn)載:歡迎轉(zhuǎn)載,但未經(jīng)作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任

到此這篇關(guān)于C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳解的文章就介紹到這了,更多相關(guān)C++11 線程同步接口std::condition_variable和std::future內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++11互斥量的具體使用

    C++11互斥量的具體使用

    互斥量是一種同步原語,是一種線程同步的手段,用來保護多線程同時訪問的共享數(shù)據(jù),本文主要介紹了C++11互斥量的具體使用,感興趣的可以了解一下
    2023-11-11
  • C++中std的使用及說明

    C++中std的使用及說明

    這篇文章主要介紹了C++中std的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++中的list模擬實現(xiàn)解讀

    C++中的list模擬實現(xiàn)解讀

    文章詳解C++ list模擬實現(xiàn),采用雙向循環(huán)鏈表結(jié)構(gòu),通過迭代器封裝與運算符重載實現(xiàn)容器功能,涵蓋構(gòu)造、拷貝、內(nèi)存管理及異常安全等關(guān)鍵點,并討論了測試與改進方向,如移動語義和STL兼容性
    2025-09-09
  • C++實現(xiàn)模板中的非類型參數(shù)的方法

    C++實現(xiàn)模板中的非類型參數(shù)的方法

    這篇文章主要介紹了C++實現(xiàn)模板中的非類型參數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C語言可變參數(shù)函數(shù)詳解示例

    C語言可變參數(shù)函數(shù)詳解示例

    一般我們編程的時候,函數(shù)中形式參數(shù)的數(shù)目通常是確定的,在調(diào)用時要依次給出與形式參數(shù)對應(yīng)的實際參數(shù)。但在某些情況下我們希望函數(shù)的參數(shù)個數(shù)可以根據(jù)需要確定,因此c語言引入可變參數(shù)函數(shù)。典型的可變參數(shù)函數(shù)的例子有printf()、scanf()等,下面我就開始講解
    2013-11-11
  • 在vs2017上配置AppGameKit庫的圖文教程

    在vs2017上配置AppGameKit庫的圖文教程

    這篇文章主要介紹了在vs2017上配置AppGameKit庫的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • opencv4.5.4+VS2022開發(fā)環(huán)境搭建的實現(xiàn)

    opencv4.5.4+VS2022開發(fā)環(huán)境搭建的實現(xiàn)

    本文主要介紹了opencv4.5.4+VS2022開發(fā)環(huán)境搭建的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 深入解析Radix Sort基數(shù)排序算法思想及C語言實現(xiàn)示例

    深入解析Radix Sort基數(shù)排序算法思想及C語言實現(xiàn)示例

    基數(shù)排序和桶排序、計數(shù)排序共同是三種最常用的線性排序算法,這里我們就來深入解析Radix Sort基數(shù)排序算法思想及C語言實現(xiàn)示例,需要的朋友可以參考下
    2016-07-07
  • 如何在Qt中實現(xiàn)關(guān)于Json?的操作

    如何在Qt中實現(xiàn)關(guān)于Json?的操作

    JSON是一種輕量級數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,這篇文章主要介紹了在Qt中實現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下
    2023-08-08
  • 算法學習入門之使用C語言實現(xiàn)各大基本的排序算法

    算法學習入門之使用C語言實現(xiàn)各大基本的排序算法

    這篇文章主要介紹了使用C語言實現(xiàn)各大基本的排序算法的方法,同時也對算法的選擇問題上給出了一些建議,的朋友可以參考下
    2015-12-12

最新評論

柳河县| 宁陕县| 肥东县| 枣阳市| 株洲县| 宁德市| 璧山县| 新安县| 宁化县| 盘山县| 法库县| 木兰县| 扶沟县| 平凉市| 新密市| 韩城市| 保山市| 景泰县| 民县| 儋州市| 朝阳区| 临沂市| 凉城县| 隆安县| 邵东县| 琼结县| 布拖县| 美姑县| 云林县| 府谷县| 老河口市| 江阴市| 万安县| 莆田市| 潜山县| 嘉兴市| 米脂县| 乌拉特中旗| 沁阳市| 龙川县| 隆林|