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

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

 更新時間:2024年09月17日 10:32:57   作者:robot2017  
本文介紹了std::condition_variable和std::future在C++中的應用,用于線程間的同步和異步執(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接口阻塞當前線程等待結果。如下圖所示,Thread 2中future接口的get或wait接口會阻塞當前線程,std::async異步開啟的新線程Thread1執(zhí)行結束后,將結果存于std::future后通知Thread 1獲取結果后繼續(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;
}

輸出結果

分析主程序中調用std::async異步調用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()方法會阻塞主線程,直到獲取結果。

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

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

相關文章

  • 一文搞懂C++多態(tài)的用法

    一文搞懂C++多態(tài)的用法

    C++多態(tài)是在繼承的基礎上實現(xiàn)的,了解多態(tài)之前我們需要掌握一定的C++繼承的知識,本文將介紹C++中多態(tài)的概念,構成條件以及用法,感興趣的可以學習一下
    2022-04-04
  • 實例解析C++設計模式編程中簡單工廠模式的采用

    實例解析C++設計模式編程中簡單工廠模式的采用

    這篇文章主要介紹了C++設計模式編程中簡單工廠模式的采用實例,在簡單工廠模式中程序往往利用封裝繼承來降低耦合度,需要的朋友可以參考下
    2016-03-03
  • 使用kendynet構建異步redis訪問服務

    使用kendynet構建異步redis訪問服務

    這篇文章主要介紹了在kendynet上寫的一個簡單的redis異步訪問接口,大家參考使用吧
    2014-01-01
  • C++詳細分析線程間的同步通信

    C++詳細分析線程間的同步通信

    線程間不通信的話,每個線程受CPU的調度,沒有任何執(zhí)行上的順序可言,線程1和線程2是根據(jù)CPU調度算法來的,兩個線程都有可能先運行,是不確定的,線程間的運行順序是不確定的,所以多線程程序出問題,難以復現(xiàn),本章我們就來了解線程間的同步通信
    2022-05-05
  • C++ 繼承詳解及實例代碼

    C++ 繼承詳解及實例代碼

    這篇文章主要介紹了C++ 繼承詳解,這里整理了詳細的資料及實例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • C++內存模型與名稱空間概念講解

    C++內存模型與名稱空間概念講解

    這篇文章主要介紹了C++內存模型與名稱空間,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • 淺析c++中new和delete的用法

    淺析c++中new和delete的用法

    以下是對c++中new和delete的用法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • 淺談C++的淺拷貝出現(xiàn)的錯誤

    淺談C++的淺拷貝出現(xiàn)的錯誤

    下面小編就為大家?guī)硪黄獪\談C++的淺拷貝出現(xiàn)的錯誤。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++之a(chǎn)ssert推薦用法及注意事項

    C++之a(chǎn)ssert推薦用法及注意事項

    這篇文章主要給大家介紹了關于C++之a(chǎn)ssert推薦用法及注意事項的相關資料,assert 是一個預處理宏,用于在運行時檢查表達式是否為真,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • C語言中單鏈表的基本操作指南(增刪改查)

    C語言中單鏈表的基本操作指南(增刪改查)

    鏈表跟數(shù)組不同的是非連續(xù)存儲結構,也就是說實現(xiàn)鏈表需要一個指針,每用完一個節(jié)點指針指向下一個節(jié)點,直至表尾,下面這篇文章主要給大家介紹了關于C語言中單鏈表的基本操作之增刪改查的相關資料,需要的朋友可以參考下
    2021-09-09

最新評論