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

C++20新特性之std::jthread和chrono庫(kù)擴(kuò)展

 更新時(shí)間:2026年06月04日 09:27:18   作者:gccbuaa  
C++20標(biāo)準(zhǔn)庫(kù)特性2.3 std::jthread2.3.1 jthread 語(yǔ)法格式 常用方法2.3.2 總結(jié)2.4 chrono庫(kù)擴(kuò)展2.4.1 語(yǔ)法格式與核心概念2.4.1.1 日歷類型創(chuàng)建2.4.1.2 ok() 判斷有效性2.4.1.3 常用方法2.4.2 舉例 本文記錄

本文記錄C++20新特性之std::jthread和chrono庫(kù)擴(kuò)展。

 std::jthread

在C++11的thread是,如果忘記 join()( 讓主線程等待子線程結(jié)束) 或者 detach()分離線程,當(dāng)std::thread析構(gòu)時(shí),程序會(huì)直接調(diào)用terminate()崩潰。
在C++20中引入了 jthread,就是為了遵循RAII原則,析構(gòu)時(shí)自動(dòng)調(diào)用 join(),保證程序不崩潰。

1 jthread 語(yǔ)法格式 常用方法

stdL::jthread 與 C++11的thread都包含在 頭文件中,使用方式基本一致,新功能如下:
1 自動(dòng)join(),當(dāng) std::jthread 對(duì)象離開作用域時(shí),如果線程還在運(yùn)行,主線程等待子線程結(jié)束(join)。
示例1:jthread基本使用
jthread析構(gòu)時(shí)自動(dòng)調(diào)用join() ,示例如下:

void worker() {
std::cout << "Working..." << std::endl;
}
void test()
{
// 語(yǔ)法與 std::thread 一樣
std::jthread t(worker);
// 不需要手動(dòng)調(diào)用join(),而是test()結(jié)束時(shí),t析構(gòu),自動(dòng)等待線程完成
}

2 協(xié)作式中斷:線程函數(shù)可以接收一個(gè) std::stop_token 參數(shù),用于檢查外部是否請(qǐng)求停止。

  • request_stop(): 外部調(diào)用,請(qǐng)求線程停止。
  • get_stop_token(): 獲取關(guān)聯(lián)的停止令牌。
  • stop_requested(): 在線程內(nèi)部檢查是否收到了停止請(qǐng)求。

示例2,子線程運(yùn)行2秒,在主線程中請(qǐng)求子線程停止。

void interruptibleWorker(std::stop_token stoken)
{
while (true)
{
// 定期檢查是否請(qǐng)求停止
if (stoken.stop_requested())
{
std::cout << "Stopping work..." << std::endl;
break;
}
// 模擬工作
std::cout << "Working..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
}
void test()
{
std::jthread t(interruptibleWorker);
std::this_thread::sleep_for(std::chrono::seconds(2));
// 手動(dòng)請(qǐng)求停止
t.request_stop();
/*
Working...
Working...
Working...
Working...
Working...
Working...
Working...
Working...
Working...
Working...
Stopping work...
*/
}

2 總結(jié)

jthread 是現(xiàn)代C++多線程的首選,jthread更安全,利用了RAII特性,避免了忘記join()導(dǎo)致的崩潰。
內(nèi)置 std::stop_token,提供了一套標(biāo)準(zhǔn)的、線程安全的停止機(jī)制,替代了過(guò)去常用的 bool is_running 標(biāo)志位。
建議,在C++20以后的項(xiàng)目中使用jthread代替thread.

chrono庫(kù)擴(kuò)展

在C++11中引入了,提供了高精度的計(jì)時(shí)功能,但是在日歷和時(shí)區(qū)的處理上幾乎是一片空白。比如,
缺乏日歷計(jì)算:計(jì)算“下個(gè)月的今天是星期幾”,不容易實(shí)現(xiàn)。
沒(méi)有時(shí)區(qū)支持:無(wú)法原生處理 UTC 與本地時(shí)間的轉(zhuǎn)換。
類型不安全:struct tm 中的月份從 0 開始,年份從 1900 開始,極易出錯(cuò)。
C++20 將 Howard Hinnant 的 date 庫(kù)正式納入標(biāo)準(zhǔn),讓 C++ 終于擁有了日期和時(shí)區(qū)處理能力。

1 語(yǔ)法格式與核心概念

1.1 日歷類型創(chuàng)建

在C++20中,可以使用 / 運(yùn)算符來(lái)組合 年月日。

void test()
{
// 創(chuàng)建一個(gè)日期:2023年10月24日
auto date1 = 2023y / 10 / 24; // 年月日
auto date2 = 24d / 10 / 2023y; // 日月年
auto date3 = October / 24 / 2023y; // 直接使用月份名稱
std::cout << "Date1: " << date1 << std::endl;
// Date1: 2023-10-24
std::cout << "Date2: " << date2 << std::endl;
// Date2: 2023-10-24
std::cout << "Date3: " << date3 << std::endl;
// Date3: 2023-10-24
}

1.2 ok() 判斷有效性

創(chuàng)建一個(gè)日期,并判斷有效性。

auto d = 2023y / 2 / 30; // 2月沒(méi)有30號(hào)
if (!d.ok()) {
std::cout << "Invalid Date!" << std::endl;
}

1.3 常用方法

A 日歷組件

  • std::chrono::year, month, day: 基礎(chǔ)單位。
  • std::chrono::weekday: 星期幾(支持 Monday, Tuesday 等常量)。
  • std::chrono::year_month_day: 完整的日期結(jié)構(gòu)。
  • std::chrono::sys_days: 基于系統(tǒng)時(shí)鐘的天數(shù)精度時(shí)間點(diǎn)(通常用于轉(zhuǎn)換)。
    B. 時(shí)區(qū)組件 (Time Zones)
  • std::chrono::locate_zone(“Name”): 獲取特定時(shí)區(qū)(如 “Asia/Shanghai”)。
  • std::chrono::current_zone(): 獲取當(dāng)前系統(tǒng)時(shí)區(qū)。
  • std::chrono::zoned_time: 結(jié)合了時(shí)間點(diǎn)和時(shí)區(qū)的對(duì)象。
void test()
{
auto now = system_clock::now();
cout << "Current time: " << now << endl;
// Current time: 2025-12-03 03:01:12.5341520
// 轉(zhuǎn)為紐約時(shí)間
auto ny_tz = zoned_time{ "America/New_York", now };
cout << "New York time: " << ny_tz << endl;
// New York time: 2025-12-02 22:01:12.5341520 GMT-5
// 轉(zhuǎn)為上海時(shí)間
// 轉(zhuǎn)換為上海時(shí)間
auto sh_time = zoned_time{ "Asia/Shanghai", now };
cout << "Shanghai time: " << sh_time << endl;
// Shanghai time: 2025-12-03 11:01:12.5341520 GMT+8
}

C 新的時(shí)鐘

  • std::chrono::utc_clock: 協(xié)調(diào)世界時(shí)(考慮閏秒)。
  • std::chrono::file_clock: 用于文件系統(tǒng)的時(shí)間(std::filesystem::last_write_time)。

2 舉例

示例1:計(jì)算“2024年每個(gè)月的最后一個(gè)星期五”,用于生成定期報(bào)表任務(wù)。

void list_report_days(int yearNum)
{
year y{ yearNum };
for (auto m = 1; m <= 12; ++m)
{
month mo{ static_cast<unsigned>(m) };
  // 語(yǔ)法糖:year_month_day_last 表示某月的最后一天
  auto last_day_of_month = y / mo / last;
  // 轉(zhuǎn)換為 sys_days 以便進(jìn)行星期計(jì)算
  sys_days sd = last_day_of_month;
  // 找到這個(gè)月的最后一個(gè)星期五
  // weekday_last 表示“最后一個(gè)星期X”
  auto last_friday = y / mo / Friday[last];
  std::cout << last_friday << std::endl;
  }
  /*
  2025/Jan/Fri[last]
  2025/Feb/Fri[last]
  2025/Mar/Fri[last]
  2025/Apr/Fri[last]
  2025/May/Fri[last]
  2025/Jun/Fri[last]
  2025/Jul/Fri[last]
  2025/Aug/Fri[last]
  2025/Sep/Fri[last]
  2025/Oct/Fri[last]
  2025/Nov/Fri[last]
  2025/Dec/Fri[last]
  */
  }
  void test()
  {
  list_report_days(2025);
  }

示例2:跨國(guó)會(huì)議時(shí)間轉(zhuǎn)換
服務(wù)器收到一個(gè) UTC 時(shí)間戳,需要將其轉(zhuǎn)換為用戶所在時(shí)區(qū)(例如東京)的本地時(shí)間字符串顯示給用戶。

void print_meeting_time(system_clock::time_point utc_tp, std::string_view user_zone) {
try {
// 1. 創(chuàng)建帶時(shí)區(qū)的時(shí)間對(duì)象
auto zt = zoned_time{ user_zone, utc_tp };
// 2. 直接輸出,自動(dòng)處理偏移量
// C++20 的 format 支持 chrono 類型
std::cout << std::format("Meeting time in {}: {:%Y-%m-%d %H:%M %Z}\n",
user_zone, zt);
}
catch (const std::runtime_error& e) {
std::cout << "Unknown time zone: " << user_zone << std::endl;
}
}
int test()
{
auto meeting_utc = system_clock::now();
print_meeting_time(meeting_utc, "Asia/Shanghai");
// Meeting time in Asia/Shanghai: 2025-12-03 11:09 GMT+8
print_meeting_time(meeting_utc, "Europe/London");
// Meeting time in Europe/London: 2025-12-03 03:09 GMT
print_meeting_time(meeting_utc, "America/Los_Angeles");
// Meeting time in America/Los_Angeles: 2025-12-02 19:09 GMT-8
return 0;
}

到此這篇關(guān)于C++20新特性之std::jthread和chrono庫(kù)擴(kuò)展的文章就介紹到這了,更多相關(guān)C++20 std::jthread和chrono庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++字節(jié)序的深入理解

    C/C++字節(jié)序的深入理解

    本文主要介紹了C/C++字節(jié)序的深入理解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++中的delete不會(huì)將操作數(shù)置0

    C++中的delete不會(huì)將操作數(shù)置0

    這篇文章主要介紹了C++中的delete不會(huì)將操作數(shù)置0的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問(wèn)題探究

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問(wèn)題探究

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中約瑟夫環(huán)問(wèn)題,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路
    2023-01-01
  • C語(yǔ)言大小端模式、判斷大小端、大小端轉(zhuǎn)換方法詳解

    C語(yǔ)言大小端模式、判斷大小端、大小端轉(zhuǎn)換方法詳解

    這篇文章主要介紹了C語(yǔ)言大小端模式、判斷大小端、大小端轉(zhuǎn)換的相關(guān)資料,大端和小端是數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式,大端模式下高字節(jié)存于低地址,小端模式則相反,大小端問(wèn)題由數(shù)據(jù)類型多字節(jié)存儲(chǔ)引起,不同選擇形成不同存儲(chǔ)模式,需要的朋友可以參考下
    2024-10-10
  • C語(yǔ)言全排列回溯算法介紹

    C語(yǔ)言全排列回溯算法介紹

    大家好,本篇文章主要講的是C語(yǔ)言全排列回溯算法介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Windows環(huán)境給FFmpeg集成AVS3解碼器

    Windows環(huán)境給FFmpeg集成AVS3解碼器

    libuavs3d是AVS3標(biāo)準(zhǔn)的解碼器,支持windows/linux/arm/ios等所有常用平臺(tái),在移動(dòng)端最高支持4K/30fps視頻實(shí)時(shí)解碼,解碼速度大幅領(lǐng)先AV1開源解碼器dav1d和aomdec,由于FFmpeg默認(rèn)未啟用libuavs3d,因此需要重新配置FFmpeg,標(biāo)明啟用libuavs3d,然后重新編譯安裝FFmpeg
    2024-05-05
  • C++中的中介者模式詳解

    C++中的中介者模式詳解

    本文介紹了C++標(biāo)準(zhǔn)庫(kù)中的算法,主要包括非修改序列算法(如find、count、for_each等)和修改序列算法(如copy、replace、remove等),以及排序、堆、最小/最大值、數(shù)值和其他算法(如sort、stable_sort、generate等),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 聊聊Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問(wèn)題

    聊聊Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問(wèn)題

    這篇文章主要介紹了Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問(wèn)題,給大家介紹了圖像的克隆及拷貝問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • VSCode中C/C++編碼亂碼問(wèn)題的兩種解決方法

    VSCode中C/C++編碼亂碼問(wèn)題的兩種解決方法

    在中國(guó)地區(qū),Windows 系統(tǒng)中的 cmd 和 PowerShell 默認(rèn)編碼是 GBK,但 VSCode 默認(rèn)使用 UTF-8 編碼,這種編碼不一致會(huì)導(dǎo)致在 VSCode 終端中運(yùn)行 C/C++ 程序時(shí)出現(xiàn)亂碼,以下介紹兩種方法來(lái)解決這一問(wèn)題,需要的朋友可以參考下
    2025-03-03
  • C++私有繼承與EBO深入分析講解

    C++私有繼承與EBO深入分析講解

    這篇文章主要介紹了C++私有繼承,在私有繼承當(dāng)中,基類的公有成員和保護(hù)成員都會(huì)成為派生類的私有成員。這意味著基類的方法都會(huì)被private關(guān)鍵字描述,我們可以在派生類中使用它,但類對(duì)象無(wú)法直接調(diào)用,下面來(lái)看看詳細(xì)內(nèi)容吧
    2022-08-08

最新評(píng)論

乌恰县| 吉隆县| 武鸣县| 太仆寺旗| 南城县| 理塘县| 合阳县| 临西县| 汽车| 宁波市| 福贡县| 民乐县| 张家港市| 济南市| 油尖旺区| 酒泉市| 万州区| 泽州县| 昌乐县| 双峰县| 广东省| 调兵山市| 温泉县| 洛阳市| 潼南县| 镇远县| 华阴市| 江都市| 洮南市| 大石桥市| 方城县| 临潭县| 仪陇县| 浪卡子县| 海盐县| 塘沽区| 奈曼旗| 安陆市| 正定县| 泰和县| 遵化市|