C++11的線程

線程的創建

? ? ? ? 用std::thread創建線程非常簡單,只需要提供線程函數或者線程對象即可,并可以同時指定線程函數的參數。下面是創建線程的示例:


#include <thread>
#include <iostream>
using namespace std;void func()
{cout << "thread run...." << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t(func);t.join();cout << "main over..." << endl;return 0;
}

? ? ? ? 在上例中,函數func將會運行于線程對象t中,join函數將會阻塞,直到線程函數執行結束,如果線程函數有返回值,返回值將被忽略。

? ? ? ? 如果不希望線程被阻塞執行,可以調用線程的detach方法,將線程和線程對象分離。比如下面的例子:

#include <thread>
#include <iostream>
#include <string.h>
using namespace std;void func()
{cout << "thread run...." << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t(func);t.detach();///做其他事情cout << "main over..." << endl;while(1){if(getchar()){break;}}return 0;
}

? ? ? ? 通過detach,線程就和線程對象分離了,讓線程作為后臺線程去執行,當前線程也不會阻塞了。但需要注意的是,detach之后就無法再和線程發生聯系了,比如detach之后就不能再通過join來等待 線程執行完成,線程何時執行完成我們也無法控制了。

? ? ? ? 線程還可以接收任意個數的參數:

#include <thread>
#include <iostream>
#include <string.h>
#include <string>
using namespace std;void func(int i, double db, const string& str)
{cout << i << endl;cout << db << endl;cout << str << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t(func, 1, 2, "test");t.detach();getchar();return 0;
}

? ? ? ? 上面的例子將會輸出:

1
2
test

? ? ? ? 使用這種方法創建線程很方便,但需要注意的是,std::thread出了作用域之后將會析構,這時如果線程函數還沒有執行完就會發生錯誤,因此,需要保證線程函數的生命周期在線程變量std::thread的生命周期之內。

? ? ? ? 線程不能復制,但可以移動,例如:

#include <thread>
#include <iostream>
#include <string.h>
#include <string>
using namespace std;void func()
{cout << "111111111111" << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t(func);std::thread t1(std::move(t));t1.join();getchar();return 0;
}

? ? ? ? 線程被移動之后,線程對象t將不在不代表任何線程了。另外,還可以通過std::bind或lambda表達式來創建線程,代碼如下:

#include <thread>
#include <iostream>
#include <string.h>
#include <string>
#include <functional>
using namespace std;void func(int a, double db)
{cout << a << "\t" << db << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t1(std::bind(func, 1, 2));std::thread t2([](int a, double db){ cout << a << "\t" << db << endl;}, 5, 6);t1.join();t2.join();getchar();return 0;
}

? ? ? ? 需要注意的是線程對象的生命周期,比如下面的代碼:

#include <thread>
#include <iostream>
#include <string.h>
#include <string>
#include <functional>
using namespace std;void func(int a, double db)
{cout << a << "\t" << db << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t1(func, 1, 2);///join函數注釋了,會有異常發生///t1.join();return 0;
}

? ? ? ? 上面的代碼運行可能會拋出異常,因為線程對象可能先于線程函數結束,應該保證線程對象的生命周期在線程函數執完時仍然存在。可以通過join方法來阻塞等待線程函數執行完,或者通過detach方法讓線程在后臺執行。

線程的基本用法

獲取當前信息

? ? ? ? 線程可以通過當前線程的ID,還可以獲取CPU核心數量,例如:


#include <thread>
#include <iostream>
#include <string.h>
#include <string>
#include <functional>
using namespace std;void func()
{
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t1(func);cout << t1.get_id() << endl;cout << std::thread::hardware_concurrency() << endl;t1.join();return 0;
}

線程休眠

? ? ? ? 可以使當前線程休眠一定時間,代碼如下:

#include <thread>
#include <iostream>
#include <string.h>
#include <string>
#include <functional>
using namespace std;void func()
{std::this_thread::sleep_for(std::chrono::seconds(3));cout << "time out" << endl;
}/// g++ thread.cpp  -lpthread
int main()
{std::thread t1(func);t1.join();return 0;
}

? ? ? ? 在上面的例子中,線程將會休眠3秒,3秒之后將打印time out。

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

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

相關文章

C# 獲取圖像、字體等對象大小的數據結構SizeF

如果你想要獲取字符串 "你好嗎" 的字節數組長度或者字符數&#xff0c; 使用如下代碼&#xff1a; string s "你好嗎"; //字節數組長度 int byteCount System.Text.Encoding.UTF8.GetBytes(s).Length; //字符數 int charCount s.Length; 如果你想獲取…

大話設計模式C++實現

大話設計模式&#xff0c;講得非常好&#xff0c;但是作者是用C#寫的&#xff0c;為了方便C程序員&#xff0c;使用C寫了大話設計模式的代碼 詳情見Github&#xff1a;https://github.com/liubamboo/BigTalkDesignPattern

新蘋果手機如何導入舊手機數據?解決方案來了,記得收藏!

為了保持其競爭優勢&#xff0c;蘋果公司不斷推出新的產品和服務&#xff0c;因此蘋果手機的更新換代速度是比較快的。正巧最近剛出了iPhone15&#xff0c;相信很多小伙伴已經換上了期待已久的新手機。 更換新手機后&#xff0c;大家都會面臨一個問題&#xff1a;新蘋果手機如…

java 手機商城免費搭建+電商源碼+小程序+三級分銷+SAAS云平臺

【SAAS云平臺】打造全行業全渠道全場景的SaaS產品&#xff0c;為店鋪經營場景提供一體化解決方案&#xff1b;門店經營區域化、網店經營一體化&#xff0c;本地化、全方位、一站式服務&#xff0c;為多門店提供統一運營解決方案&#xff1b;提供豐富多樣的營銷玩法覆蓋所有經營…

Windows DOS 常用命令

文章目錄 1 概述1.1 官方文檔1.2 常用 2 分類2.1 目錄2.2 文件2.3 網絡2.4 系統 1 概述 1.1 官方文檔 Windows 命令官方文檔&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/windows-commands 1.2 常用 win r # 打開運…

如何預防數據泄露?六步策略幫您打造企業信息安全壁壘

大家好&#xff01;我是恒小馳&#xff0c;今天我想和大家聊聊一個非常重要的話題——如何預防數據泄露。在這個數字化的時代&#xff0c;數據已經成為了我們生活中不可或缺的一部分。然而&#xff0c;隨著數據的價值日益凸顯&#xff0c;數據泄露的風險也隨之增加。企業應該如…

MacBook使用指南

一、安裝及卸載Windows系統 1、卸載Windows系統 步驟① 點擊下側任務欄中的“啟動臺”&#xff0c;進入程序塢&#xff0c;點擊"其他",選擇“啟動轉換助理” 步驟② 點擊“繼續”&#xff0c;接著點擊“恢復”&#xff0c;即可卸載Windows系統 2、安裝Windows系統 …

Shell編程里if的參數從-a到-z詳解

Shell編程里if的參數從-a到-z詳解

智能醫療越發周到!新的機器人系統評估中風后的活動能力

原創 | 文 BFT機器人 中風是在醫療界上最難的解決的病例之一&#xff0c;全球每年有超過1500萬人中風&#xff0c;四分之三的中風患者的手臂和手部會出現損傷、虛弱和癱瘓。 許多中風患者日常生活是依靠他們強壯的手臂來完成的&#xff0c;從拿一些小東西到梳頭&#xff0c;即…

phpstudy和IDEA 配置php debug

1.安裝xdebug 擴展&#xff0c;phpinfo() 查看 2.配置php.ini zend_extensionD:/phpstudy_pro/Extensions/php/php7.4.3nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_traceOn xdebug.trace_output_dirD:/phpstudy_pro/Extensions/php_l…

c語言新龜兔賽跑

以下是一個使用C語言編寫的新的龜兔賽跑游戲&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>int main() { int distance, turtle_speed, rabbit_speed, turtle_time, rabbit_time, rabbit_lead; srand(time(NULL)); // 隨機數種…

Whatweb簡單使用

目錄 簡介 安裝 debian/ubtuntu redhat/centos 特性 使用 常用參數如下&#xff1a; whatweb -v whatweb --version whatweb -i 1.txt whatweb -v www.baidu.com 掃描等級 whatweb -a 4 www.baidu.com 掃描網段 whatweb --no-errors -t 255 192.168.71.0/24 導出…

http與https有什么區別,https攻擊要如何防護

我們在瀏覽網站時&#xff0c;在網址的前面經常會看到http// 或者https//的顯示。同樣是http&#xff0c;加了s與不加s是有什么區別&#xff0c;加了s又有哪些用處。 http&#xff0c;中文叫做超文本傳輸協議。它是一種用于分布式、協作式和超媒體信息系統的應用層協議。是基于…

在vscode中添加代碼提示

添加配置 run->add_configuration 添加頭文件路徑 在c_cpp_properties.json中添加頭文件路徑 效果

時間敏感網絡TSN的車載設計實踐: 802.1Qbv協議

▎概述 IEEE 802.1Qbv[1]是TSN系列協議中備受關注的技術之一&#xff0c;如圖1所示&#xff0c;它定義了一種時間感知整形器&#xff08;Time Aware Shaper&#xff0c;TAS&#xff09;&#xff0c;支持Qbv協議的交換機可以按照配置好的門控列表來打開/關閉交換機出口隊列&…

Spring Validation實踐及其實現原理

Bean Validation 2.0 注解 校驗空值 Null&#xff1a;驗證對象是否為 null NotNull&#xff1a;驗證對象是否不為 null NotEmpty&#xff1a;驗證對象不為 null&#xff0c;且長度&#xff08;數組、集合、字符串等&#xff09;大于 0 NotBlank&#xff1a;驗證字符串不為 nul…

2023軟件應用類下載系統平臺源碼/手機軟件應用、新聞資訊下載站/軟件庫網站源碼

源碼簡介&#xff1a; 這個是最新軟件應用類平臺源碼、手機應用下載系統源碼、軟件應用市場下載站源碼、新聞資訊軟件下載。2023軟件應用類平臺源碼/手機軟件應用、新聞資訊下載站&#xff0c;它是軟件庫網站源碼。 最新軟件應用類平臺源碼 手機應用下載系統源碼 軟件應用市場…

NX二次開發UF_CURVE_add_faces_ocf_data 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_add_faces_ocf_data Defined in: uf_curve.h int UF_CURVE_add_faces_ocf_data(tag_t face_tag, UF_CURVE_ocf_data_p_t uf_offset_data ) overview 概述 Add a face col…

JVMj之console Java監視與管理控制臺

jconsole Java監視與管理控制臺 1、jconsole介紹 jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions) 的可視化監視和管理工具。 2、啟動jconsole 1、在linux和windwos下通過jconsole啟動即可。 2、然后會自動搜索本機運行的…