c+++11并發編程語言,C++11并發編程:多線程std:thread

原標題:C++11并發編程:多線程std:thread

一:概述

C++11引入了thread類,大大降低了多線程使用的復雜度,原先使用多線程只能用系統的API,無法解決跨平臺問題,一套代碼平臺移植,對應多線程代碼也必須要修改。現在在C++11中只需使用語言層面的thread可以解決這個問題。

所需頭文件

二:構造函數

1.默認構造函數

thread() noexcept

一個空的std::thread執行對象

2.初始化構造函數

template

explicit thread(Fn&& fn, Args&&... args);

創建std::thread執行對象,線程調用threadFun函數,函數參數為args。

void threadFun(int a)

{

cout << "this is thread fun !" << endl;

}

thread t1(threadFun, 2);

3.拷貝構造函數

thread(const thread&) = delete;

拷貝構造函數被禁用,std::thread對象不可拷貝構造

void threadFun(int& a)

{

cout << "this is thread fun !" << endl;

}

int value = 2;

thread t1(threadFun, std::ref(value));

4.Move構造函數

thread(thread&& x)noexcept

調用成功原來x不再是std::thread對象

void threadFun(int& a)

{

cout << "this is thread fun !" << endl;

}

int value = 2;

thread t1(threadFun, std::ref(value));

thread t2(std::move(t1));

t2.join();

三:成員函數

1.get_id()

獲取線程ID,返回類型std::thread::id對象。

thread t1(threadFun);

thread::id threadId = t1.get_id();

cout << "線程ID:" << threadId << endl;

//threadId轉換成整形值,所需頭文件

ostringstream oss;

oss << t1.get_id();

string strId = oss.str();

unsigned long long tid = stoull(strId);

cout << "線程ID:" << tid << endl;

2.join()

創建線程執行線程函數,調用該函數會阻塞當前線程,直到線程執行完join才返回。

thread t1(threadFun);

t1.join() //阻塞等待

3.detach()

detach調用之后,目標線程就成為了守護線程,駐留后臺運行,與之關聯的std::thread對象失去對目標線程的關聯,無法再通過std::thread對象取得該線程的控制權。

4.swap()

交換兩個線程對象

thread t1(threadFun1);

thread t2(threadFun2);

cout << "線程1的ID:" << t1.get_id() << endl;

cout << "線程2的ID:" << t2.get_id() << endl;

t1.swap(t2);

cout << "線程1的ID:" << t1.get_id() << endl;

cout << "線程2的ID:" << t2.get_id() << endl;

5.hardware_concurrency()

獲得邏輯處理器儲量,返回值為int型

int coreNum = thread::hardware_concurrency();

四:使用

1.創建線程

void threadFun1()

{

cout << "this is thread fun1 !" << endl;

}

int main()

{

thread t1(threadFun1);

t1.join();

getchar();

return 1;

}

2.創建線程,傳參

void threadFun1(int v)

{

cout << "this is thread fun1 !" << endl;

cout << v << endl;

}

int main()

{

int value = 6;

thread t1(threadFun1, value);

t1.join();

getchar();

return 1;

}

需要注意,變量int value 和int v 做變量傳遞時并不是引用,而是對變量做了拷貝,所以在傳遞給int v前,int value不能出作用域(釋放了內存),join(),可以保證int value變量釋放內存,如果使用detach(),可能存在這種情況。

3.創建線程,引用傳參

void threadFun1(int& v)

{

cout << "this is thread fun1 !" << endl;

cout << v << endl;

}

int main()

{

int value = 6;

thread t1(threadFun1, std::ref(value));

t1.join();

getchar();

return 1;

}

4.創建建線程,線程函數為類成員函數

class Object

{

public:

Object()

{

cout << "構造函數" << endl;

}

~Object()

{

cout << "析構函數" << endl;

}

void fun(string info)

{

cout << info << endl;

}

};

int main()

{

Object obj;

string str = "我是一個類的成員函數!";

thread t1(&Object::fun, &obj, str);

t1.join();

getchar();

return 1;

---------------------

作者:蝸牛201

原文:https://blog.csdn.net/woniu211111/article/details/85123281

責任編輯:

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

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

相關文章

交換機虛擬化和堆疊的區別_核心交換機和普通交換機有何區別?

提起核心交換機與普通交換機有什么區別&#xff1f;相信很多朋友都有點迷惑&#xff0c;今天我們一起來了解下。核心交換機并不是交換機的一種類型&#xff0c;而是放在核心層(網絡主干部分)的交換機叫核心交換機。一般大型企業網絡和網吧需要購買核心交換機來實現強大的網絡擴…

tmpfiles.d導致的unix:///tmp/supervisor.sock no such file坑(待續)

為什么80%的碼農都做不了架構師&#xff1f;>>> 系統環境: CentOS Linux release 7.1.1503 (Core) supervisor 3.3.1今天初七&#xff0c;剛放完假需要去supervisor restart下程序。發現報了這個錯誤。但是看supervisord的進程還在運行&#xff0c;項目代碼也還在…

springMVC兩種方式實現多文件上傳及效率比較

springMVC實現多文件上傳的方式有兩種&#xff0c;一種是我們經常使用的以字節流的方式進行文件上傳&#xff0c;另外一種是使用springMVC包裝好的解析器進行上傳。這兩種方式對于實現多文件上傳效率上卻有著很大的差距&#xff0c;下面我們通過實例來看一下這兩種方式的實現方…

c語言 個位,如何才能給C語言增加幾個位操作函數

在匯編語言中有直接對位進行操作的指令&#xff0c;如置位、復位、位取反、測試某一位等&#xff0c;這對于硬件操作十分方便&#xff0c;在C語言中盡管也提供了一些位操作手段&#xff0c;如按位與、按位或、按位取反等&#xff0c;但它們是對一個字節進行操作&#xff0c;如要…

hsrp 切換_HSRP、VRRP、GLBP | 網絡工程師之網關高可用、冗余

在RS的學習過程中我們接觸到很多網絡技術&#xff0c;后面就把工作中常用的拿來與大家分享&#xff0c;本次我們來分享網關冗余技術。當我們的網關設備無法使用堆疊(VSS,istack&#xff0c;IRF)&#xff0c;或者不同廠商設備的時候&#xff0c;非常有效&#xff0c;能夠提供網關…

Linux文件系統詳解

從操作系統的角度詳解Linux文件系統層次、文件系統分類、文件系統的存儲結構、不同存儲介質的區別(RAM、ROM、Flash)、存儲節點inode。本文參考&#xff1a; http://blog.chinaunix.net/uid-8698570-id-1763151.htmlhttp://www.iteye.com/topic/816268http://soft.chinabyte.co…

opencv機器學習線性回歸_機器學習(線性回歸(二))

Lasso與嶺回歸的同和異Lasso、嶺回歸都可以預防模型過擬合Lasso回歸懲罰項為L1正則&#xff0c;嶺回歸為L2正則Lasso回歸可用來特征選擇&#xff0c;嶺回歸則不能Lasso回歸用坐標下降法求解&#xff0c;嶺回歸用梯度下降法求解。為什么Lasso可用于特征選擇&#xff0c;而嶺回歸…

c語言int a什么意思,問一下吧里大神 int a = a; 這么定義是什么意思?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓使用自身初始化&#xff0c;具有indeterminate value&#xff0c;可能是trap representation導致使用這個對象的值引起undefined behavior。但這個初始化語法上是正確的&#xff0c;也沒有語義錯誤。ISO C113.19.21 indeterminate …

把EXCEL用程序導入到ORACLE中(SpringMVC+MyBatis)

前提&#xff1a;項目中需要把EXCEL數據批量導入oracle中兩張表中。如是用到了poi技術。分別導入poi-3.11-beta2.jar和poi-ooxml-schemas-3.9.jar這兩個包。EXCEL數據如下 第一步&#xff1a;修改spring框架配置文件。 springmvc-servlet.xml加上&#xff1a; <!-- 文件上傳…

access實例_西門子PLC1200組態王跟Access數據庫-⑥組態王變量

西門子PLC1200&#xff0c;組態王跟Access數據庫--⑥組態王變量組態王的變量設置1.0 變量設置如下圖所示&#xff0c;選擇數據詞典&#xff0c;里面是系統變量跟新建的變量&#xff0c;選擇新建1.1 如下圖&#xff0c;從上往下依次&#xff0c;變量名(這個應該知道)&#xff0c…

Android 擼起袖子,自己封裝 DialogFragment

前言 具體的代碼以及示例我都放上 Github 了&#xff0c;有需要的朋友可以去看一下 DialogFragmentDemos&#xff0c;歡迎 star 和 fork. 本文的主要內容 DialogFragment 是什么創建通用的 CommonDialogFragment實現各種類型的 DialogFragment在寫正文之前&#xff0c;先來一波…

as模擬器文件夾路徑_EGG Switch手機模擬器怎么用?中文教程來了......

大家好&#xff0c;小雞妹我又來啦。自從昨天曝光了美國NX工作室的EGG模擬器之后&#xff0c;推文底下就多了一千多條留言&#xff0c;說啥的都有。不過小雞妹大概總結了一下&#xff0c;發現下面這幾條問題&#xff0c;出現的頻率最高&#xff1a;① 找不到網址&#xff1b;②…

xml文件c語言讀取函數,讀寫xml文件的2個小函數

#region 讀寫xml文件的2個小函數&#xff0c;2005 4 2 by hycpublic void SetXmlFileValue(string xmlPath,string AppKey,string AppValue)//寫xmlPath是文件路徑文件名&#xff0c;AppKey是 Key Name&#xff0c;AppValue是Value{XmlDocument xDoc new XmlDocument();xDoc.L…

Java導入導出Excel工具類ExcelUtil

前段時間做的分布式集成平臺項目中&#xff0c;許多模塊都用到了導入導出Excel的功能&#xff0c;于是決定封裝一個ExcelUtil類&#xff0c;專門用來處理Excel的導入和導出 本項目的持久化層用的是JPA&#xff08;底層用hibernate實現&#xff09;&#xff0c;所以導入和導出也…

郁金香匯編代碼注入怎么寫看雪_世界黑客編程大賽冠軍的匯編代碼 你見過嗎?...

前幾天發布了一篇“雷軍22年前寫的匯編代碼”的文章&#xff0c;引起網友的熱議。有人說匯編是最牛逼的編程語言&#xff0c;沒有之一。匯編語言確實厲害&#xff0c;不知道你有沒有見過世界黑客編程大賽冠軍的作品?雷軍編寫的的匯編代碼有 網友分享了97年Mekka ’97 4K Intro…

變位齒輪重合度計算公式_齒輪“模數”是如何計算的?

模數是決定齒輪大小的因素。齒輪模數被定義為模數制輪齒的一個基本參數&#xff0c;是人為抽象出來用以度量輪齒規模的數。目的是標準化齒輪刀具&#xff0c;減少成本。直齒、斜齒和圓錐齒齒輪的模數皆可參考標準模數系列表。工業定義&#xff1a;齒輪的分度圓是設計、計算齒輪…

c語言改錯和填空能運行嗎,C語言改錯填空編程

改錯題1、在考生文件夾下&#xff0c;給定程序MODI.C的功能是&#xff1a;從低位開始取出長整型變量s中奇數位上的數&#xff0c;依次構成一個新數放在t中。例如&#xff0c;當s中的數為&#xff1a;7654321時&#xff0c;t中的數為&#xff1a;7531。請修改并運行該程序&#…

@Autowired注解實現原理

在討論代碼細節之前&#xff0c;我們再來了解下基礎知識。Spring管理可用于整個應用程序的Java對象bean。他們所在的Spring容器&#xff0c;被稱為應用程序上下文。這意味著我們不需要處理他們的生命周期(初始化&#xff0c;銷毀)。該任務由此容器來完成。另外&#xff0c;該上…

獲取freemarker處理后的內容

相信很多人都用過freemarker&#xff0c;或做視圖&#xff0c;或模板&#xff0c;或生成靜態文件等,但是有多少人做過這樣的應用&#xff0c;通過模板后&#xff0c;不是要輸出靜態的內容&#xff0c;而是直接在代碼中獲取處理模板后的內容&#xff0c;研究了下API,freemarker里…

c4.5算法python實現_算法:用Python實現—最優化算法

今天給大家分享一下算法&#xff0c;用python來實現最優化算法。廢話不多說&#xff0c;直接上代碼&#xff1a;一、二分法函數詳見rres&#xff0c;此代碼使該算法運行了兩次def asdf(x): rres8*x**3-2*x**2-7*x3 return rresi2left0right1while i>0 : i i-1 …