std::jthread与std::thread的区别
特性上,std::jthread相比std::thread主要增加了以下兩個(gè)功能:
1.std::jthread對(duì)象被destruct時(shí),會(huì)自動(dòng)調(diào)用join,等待其所表示的執(zhí)行流結(jié)束。
2.支持外部請(qǐng)求中止(通過(guò)get_stop_source、get_stop_token和request_stop)。
為什么不是選擇往std::thread添加新接口,而是引入了一個(gè)新的標(biāo)準(zhǔn)庫(kù)?因?yàn)閟td::jthread為了實(shí)現(xiàn)上述新功能,帶來(lái)了額外的性能開(kāi)銷(主要是多了一個(gè)成員變量)。而根據(jù)C++一直以來(lái)“不為不使用的功能付費(fèi)”的設(shè)計(jì)哲學(xué),他們自然就把這些新功能拆出來(lái)新做了一個(gè)類。
// C++20新線程 jthread 體驗(yàn)代碼 // // 編譯(編譯本代碼,-pedantic 不是必須的): // g++ -std=c++20 -Wall -pedantic -pthread -static-libstdc++ C++20_jthread.cpp -o C++20_jthread // // 要求GCC10及以上版本, // 可使用GCC的Docker鏡像靜態(tài)鏈接stdc++庫(kù),以方便在非GCC10環(huán)境運(yùn)行。 // // docker pull gcc // docker run --rm -it -v /data:/data gcc #include <chrono> //#include <coroutine> // -fcoroutines #include <iostream> #include <stdexcept> #include <thread>// 線程執(zhí)行體 void thread_proc(std::stop_token st) {// 以往中,// 需要自己實(shí)現(xiàn) stop 來(lái)停止線程,// 現(xiàn)在 jthread 內(nèi)置了此能力。while (!st.stop_requested()) std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "Thread " << std::this_thread::get_id() << " exit" << std::endl; }extern "C" int main() {std::jthread thr(&thread_proc); // 創(chuàng)建線程std::this_thread::sleep_for(std::chrono::seconds(10));thr.request_stop(); // 通知線程退出thr.join();return 0; }第二個(gè)特征jthread是幫助我們解決std::thread以前導(dǎo)致的困境:join或detach*。現(xiàn)在jthread來(lái)承擔(dān)一些責(zé)任。它的析構(gòu)函數(shù)簡(jiǎn)單地實(shí)現(xiàn)為:
這正是我們?cè)谏厦娴氖纠兴龅?#xff0c;因此我們可以刪除那里的最后兩行,如下:
即main的最后,我們不用join了,jthread對(duì)象被析構(gòu)時(shí),會(huì)自動(dòng)調(diào)用join函數(shù)
總結(jié)
以上是生活随笔為你收集整理的std::jthread与std::thread的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信息时代与大数据相关的8个专业
- 下一篇: 为期 1 个月,三星本周开始将对 Gal