命名空間this_thread

命名空間 - this_thread

在C++11中不僅添加了線程類,還添加了一個關于線程的命名空間std::this_thread,在這個命名空間中提供了四個公共的成員函數,通過這些成員函數就可以對當前線程進行相關的操作了。

1.get_id()

調用命名空間std::this_thread中的get_id()方法可以得到當前線程的線程ID,函數原型如下:

thread::id get_id() noexcept;

關于函數使用對應的示例代碼如下:

#include <iostream>
#include <thread>
using namespace std;void func()
{cout << "子線程: " << this_thread::get_id() << endl;
}int main()
{cout << "主線程: " << this_thread::get_id() << endl;thread t(func);t.join();
}

程序啟動,開始執行main()函數,此時只有一個線程也就是主線程。當創建了子線程對象t之后,指定的函數func()會在子線程中執行,這時通過調用this_thread::get_id()就可以得到當前線程的線程ID了。

2.sleep_for()

線程和進程的執行有很多相似之處,在計算機中啟動的多個線程都需要占用CPU資源,但是CPU的個數是有限的并且每個CPU在同一時間點不能同時處理多個任務。為了能夠實現并發處理,多個線程都是分時復用CPU時間片,快速的交替處理各個線程中的任務。因此多個線程之間需要爭搶CPU時間片,搶到了就執行,搶不到則無法執行(因為默認所有的線程優先級都相同,內核也會從中調度,不會出現某個線程永遠搶不到CPU時間片的情況)。

命名空間this_thread中提供了一個休眠函數sleep_for(),調用這個函數的線程會馬上從運行態變成阻塞態并在這種狀態下休眠一定的時長,因為阻塞態的線程已經讓出了CPU資源,代碼也不會被執行,所以線程休眠過程中對CPU來說沒有任何負擔。這個函數是函數原型如下,參數需要指定一個休眠時長,是一個時間段:

template <class Rep, class Period>void sleep_for (const chrono::duration<Rep,Period>& rel_time);

示例代碼:

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;void func()
{for (int i = 0; i < 10; ++i){this_thread::sleep_for(chrono::seconds(1));cout << "子線程: " << this_thread::get_id() << ", i = " << i << endl;}
}int main()
{thread t(func);t.join();
}

在func()函數的for循環中使用了this_thread::sleep_for(chrono::seconds(1));之后,每循環一次程序都會阻塞1秒鐘,也就是說每隔1秒才會進行一次輸出。需要注意的是:程序休眠完成之后,會從阻塞態重新變成就緒態,就緒態的線程需要再次爭搶CPU時間片,搶到之后才會變成運行態,這時候程序才會繼續向下運行。

3.sleep_until()

命名空間this_thread中提供了另一個休眠函數sleep_until(),和sleep_for()不同的是它的參數類型不一樣

  • sleep_until():指定線程阻塞到某一個指定的時間點time_point類型,之后解除阻塞
  • sleep_for():指定線程阻塞一定的時間長度duration 類型,之后解除阻塞

該函數的函數原型如下:

template <class Clock, class Duration>void sleep_until (const chrono::time_point<Clock,Duration>& abs_time);

示例代碼:

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;void func()
{for (int i = 0; i < 10; ++i){// 獲取當前系統時間點auto now = chrono::system_clock::now();// 時間間隔為2schrono::seconds sec(2);// 當前時間點之后休眠兩秒this_thread::sleep_until(now + sec);cout << "子線程: " << this_thread::get_id() << ", i = " << i << endl;}
}int main()
{thread t(func);t.join();
}

sleep_until()和sleep_for()函數的功能是一樣的,只不過前者是基于時間點去阻塞線程,后者是基于時間段去阻塞線程,項目開發過程中根據實際情況選擇最優的解決方案即可。

4.yield()

命名空間this_thread中提供了一個非常紳士的函數yield(),在線程中調用這個函數之后,處于運行態的線程會主動讓出自己已經搶到的CPU時間片,最終變為就緒態,這樣其它的線程就有更大的概率能夠搶到CPU時間片了。使用這個函數的時候需要注意一點,線程調用了yield()之后會主動放棄CPU資源,但是這個變為就緒態的線程會馬上參與到下一輪CPU的搶奪戰中,不排除它能繼續搶到CPU時間片的情況,這是概率問題

void yield() noexcept;

函數對應的示例程序如下:

#include <iostream>
using namespace std;
#include <thread>
#include <chrono>void test01() {for (int i = 0; i < 1000; i++) {cout << "子線程" << this_thread::get_id() << ", i = " << i << endl;this_thread::yield();}
}int main() {thread t1(test01);for (int i = 0; i < 1000; ++i) {cout << "主線程" << this_thread::get_id() << ", " << i << endl;}t1.join();return 0;
}

這段程序, 主線程和子線程同時數數到1000, 子線程中調用了yield函數, 會在每次執行一次后出讓線程, 因此主線程大概率會率先數到1000

結論:

  • std::this_thread::yield() 的目的是避免一個線程長時間占用CPU資源,從而導致多線程處理性能下降

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213889.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java腳本引擎Groovy動態執行

1.java腳本引擎Groovy實戰_groovy腳本-CSDN博客 2.java可用的動態腳本引擎和動態代碼執行_java動態執行代碼片段-CSDN博客 3.Groovy動態加載Java代碼的使用方法和工具類_groovy調用java類方法-CSDN博客 4.springboot應用動態運行groovy腳本-附源碼 - 簡書 (jianshu.com) 5.…

是不是學了低代碼就自動放棄了高薪?內部資深解答來了!

目錄 前言低代碼開發&#xff1a;點餐還是自助烹飪&#xff1f;低代碼的“菜單”低代碼的局限性 市場影響的分析&#xff1a;一場關于低代碼的對話低代碼開發與程序員職業&#xff1a;名人視角解析總結 前言 近年來&#xff0c;低代碼開發因其低門檻、高效率和易集成的特點受到…

conda 計算當前包的個數

Conda是一個強大的包管理器和環境管理器&#xff0c;它用于安裝和管理來自不同源的軟件包。若要計算當前conda環境中安裝的包的數量&#xff0c;你可以使用以下命令&#xff1a; 首先&#xff0c;激活你想要檢查的conda環境&#xff08;如果不是默認的base環境&#xff09;&am…

虹科新聞丨廣州市“強企增效”項目助力虹科高質量發展!

來源&#xff1a;虹科電子科技有限公司 虹科新聞丨廣州市“強企增效”項目助力虹科高質量發展&#xff01; 原文鏈接&#xff1a;https://mp.weixin.qq.com/s/9pUXx5ZZpIi5S4s4o90GJA 歡迎關注虹科&#xff0c;為您提供最新資訊&#xff01; 2023年12月6日至7日&#xff0c;工…

hive/spark用法記錄

1. cast()更改數據類型 cast(column_name as type) 2. get_dt_date()自定義日期操作函數&#xff08;返回不帶橫線的日期&#xff09; select get_dt_date();–獲取當前日期&#xff0c;返回 20170209 select get_dt_date(get_date(-2));–獲取當前日期偏移&#xff0c;轉為…

如果將視頻轉化為gif格式圖

1.選擇視頻轉換GIF&#xff1a; 2.添加視頻文件&#xff1a; 3.點擊“開始”&#xff1a; 4.選擇設置&#xff0c;將格式選擇為1080P更加清晰&#xff1a; 5.輸出后的效果圖&#xff1a;

postgresql設置免密登錄

您提供的步驟描述了在 PostgreSQL 數據庫環境中配置服務器間的 SSH 無密碼登錄和數據庫用戶認證的過程。這些步驟主要用于設置一個高可用性、負載平衡的數據庫集群環境。讓我們逐一解釋這些步驟的目的和應用場景&#xff1a; 1. 啟動 PostgreSQL 服務 systemctl start postgr…

ReetrantReadWriteLock底層原理

文章目錄 一、讀寫鎖介紹二、ReentrantReadWriteLock底層原理1. 讀寫鎖的設計 一、讀寫鎖介紹 現實中有這樣一種場景:對共享資源有讀和寫的操作&#xff0c;且寫操作沒有讀操作那么頻繁(讀多寫少)。在沒有寫操作的時候&#xff0c;多個線程同時讀一個資源沒有任何問題&#xf…

jQuery-操作DOM

使用jQuery操作DOM dom : 文檔對象模型 就是HTML元素 $() 函數的2個用法: 用法1:放入一個字符串(選擇器)表示獲取元素 例如 $("p") $("#abc") $(".del") 用法2:放入一個函數&#xff0c;表示文檔就緒函數 例如 $(function(){代…

TikTok挑戰榜單:全球用戶如何共襄盛舉

TikTok作為全球最受歡迎的短視頻應用之一&#xff0c;在這個平臺上&#xff0c;用戶們通過參與各種挑戰&#xff0c;創造了無數令人驚嘆的短視頻。 本文將深入探討TikTok挑戰榜單的現象&#xff0c;探究全球用戶如何共襄盛舉&#xff0c;以及這種創意激發和社交互動如何成為Ti…

go-zero開發入門-API網關鑒權開發示例

本文是go-zero開發入門-API網關開發示例一文的延伸&#xff0c;繼續之前請先閱讀此文。 在項目根目錄下創建子目錄 middleware&#xff0c;在此目錄下創建文件 auth.go&#xff0c;內容如下&#xff1a; // 鑒權中間件 package middlewareimport ("context""e…

前端開發常用的Vscode插件整理(持續更新)

本文記錄用vscode進行前端開發時&#xff0c;常用到的有用的vscode插件&#xff0c;將不定時更新&#xff5e; 1、Chinese (Simplified) 將編輯器變成簡體中文 2、vscode-icon 讓 vscode 資源樹目錄加上圖標&#xff0c;官方出品的圖標庫 3、Import Cost 引入包大小計算,對于…

Springboot Redis Lua 分布式限流器

pom文件中添加如下依賴包&#xff0c;比較關鍵的就是 spring-boot-starter-data-redis 和 spring-boot-starter-aop。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></d…

基于ssm實驗室開放管理系統論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本實驗室開放管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信…

高效純化樹脂A-2313 CPR

在化工、制藥等行業中&#xff0c;對colorful chemicals的純化一直是挑戰。本文將為您介紹一款具有卓越性能的強堿性陰離子交換樹脂——Tulsion A-2313 CPR。通過分析其特性和應用&#xff0c;展示其在colorful chemicals純化領域的優勢。 一、Tulsion A-2313 CPR離子交換樹脂的…

代碼隨想錄二刷 |二叉樹 |94.二叉樹的中序遍歷

代碼隨想錄二刷 &#xff5c;二叉樹 &#xff5c;二叉樹的中序遍歷 題目描述解題思路代碼實現迭代法遞歸法 題目描述 94.二叉樹的中序遍歷 給定一個二叉樹的根節點 root &#xff0c;返回 它的 中序 遍歷 。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&a…

漏洞復現-浙江宇視 isc LogReport.php 遠程命令執行漏洞(附漏洞檢測腳本)

免責聲明 文章中涉及的漏洞均已修復&#xff0c;敏感信息均已做打碼處理&#xff0c;文章僅做經驗分享用途&#xff0c;切勿當真&#xff0c;未授權的攻擊屬于非法行為&#xff01;文章中敏感信息均已做多層打馬處理。傳播、利用本文章所提供的信息而造成的任何直接或者間接的…

C++臨時對象生命周期

引言 朋友問了我一段代碼&#xff1a; const string & foo(const string & a, const string & b) {return a.empty() ? b : a; } int main () {auto & s foo("", "foo"); // auto is const stringcout << s << \n;return …

第二百回 如何獲取App自身的信息

文章目錄 1. 概念介紹2. 使用方法2.1 ClipOval2.2 ClipRRect 3. 示例代碼 我們在上一章回中介紹了AspectRatio Widget相關的內容&#xff0c;本章回中將介紹剪裁類組件(Clip).閑話休提&#xff0c;讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的剪裁類組件主要是指對…

dockerfile---創建鏡像

dockerfile創建鏡像&#xff1a;創建自定義鏡像。 包擴配置文件的創建&#xff0c;掛載點&#xff0c;對外暴露的端口。設置環境變量。 docker鏡像的方式: 1、基于官方源進行創建 根據官方提供的鏡像源&#xff0c;創建鏡像&#xff0c;然后拉起容器。是一個白板&#xff0c…