<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

      std::condition_variable

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

      con_variable_result

      具體參見示例代碼:

      #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;
      }
      

      輸出結果

      con_variable_result

      分析

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

      std::future

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

      con_variable_result

      具體參見如下代碼:

      #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函數,可以看到main函數的線程ID 27428與test函數執行的線程ID 9704并不一樣,說明std::async另起了一個新的線程。在test線程中,先sleep 1000ms,所以可以看到"After lanuch a thread:"先輸出,說明主線程異步執行,不受子線程影響。而"After get result "最后輸出,說明get()方法會阻塞主線程,直到獲取結果。
      posted @ 2024-09-17 10:23  robot2017  閱讀(375)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 自拍视频在线观看三级| 精品视频国产狼友视频| 成人国产亚洲精品一区二| 麻豆成人av不卡一二三区| 四虎在线成人免费观看| 国产免费无遮挡吸奶头视频| 无码AV无码免费一区二区| 临夏市| 免费AV手机在线观看片| 欧美极品色午夜在线视频| 美女内射福利大全在线看| 国产在线精品欧美日韩电影| 亚洲国产成人va在线观看天堂| 亚洲高清激情一区二区三区| 精品偷拍被偷拍在线观看| 高清免费毛片| 国产精品成人网址在线观看| 日韩A人毛片精品无人区乱码| 凉山| 成人免费无码不卡毛片| 国产首页一区二区不卡| 国内在线视频一区二区三区| 国产精品一区中文字幕| 精品国产91久久粉嫩懂色| 精品国产免费人成在线观看| 宝应县| 国产精品伊人久久综合网| 综合偷自拍亚洲乱中文字幕| 日韩a无v码在线播放| 久久亚洲av成人无码软件| 精品无码久久久久成人漫画| 东山县| 久久久久久九九99精品| 免费人成网站免费看视频| 亚洲欧美自偷自拍视频图片| 亚洲成av人片天堂网无码| 97久久久亚洲综合久久| 98精品全国免费观看视频| 国产在线国偷精品免费看| 久久精品网站免费观看 | 欧洲精品色在线观看|