C++11并發與多線程筆記(2)

C++11并發與多線程筆記(2) 線程啟動、結束,創建線程多法、join,detach

  • 1. 范例演示線程運行的開始
    • 1.1 創建一個線程:
    • 1.2 join
    • 1.3 datch
    • 1.4 joinable
  • 2. 其他創建線程的方法
    • 2.1 用類 重載了函數調用運算符
    • 2.2 lambda表達式創建線程

1. 范例演示線程運行的開始

  • 程序運行起來,生成一個進程,該進程所屬的主線程開始自動運行;當主線程從main()函數返回,則整個進程執行完畢
  • 主線程從**main()開始執行,**那么我們自己創建的線程,也需要從一個函數開始運行(初始函數),一旦這個函數運行完畢,線程也結束運行
  • 整個進程是否執行完畢的標志是:主線程是否執行完,如果主線程執行完畢了,就代表整個進程執行完畢了,此時如果其他子線程還沒有執行完,也會被強行終止【此條有例外,以后會解釋】

1.1 創建一個線程:

  1. 包含頭文件thread
  2. 寫初始函數
  3. 在main中創建thread
    必須要明白:有兩個線程在跑,相當于整個程序中有兩條線在同時走,即使一條被阻塞,另一條也能運行
#include <iostream>
#include <thread>
using namespace std;void myPrint()
{cout << "我的線程開始運行" << endl;//-------------//-------------cout << "我的線程運行完畢" << endl;return;
}int main()
{//(1)創建了線程,線程執行起點(入口)是myPrint;(2)執行線程thread myThread(myPrint);//(2)阻塞主線程并等待myPrint執行完,當myPrint執行完畢,join()就執行完畢,主線程繼續往下執行//join意為匯合,子線程和主線程回合myThread.join();//設置斷點可看到主線程等待子線程的過程//F11逐語句,就是每次執行一行語句,如果碰到函數調用,它就會進入到函數里面//F10逐過程,碰到函數時,不進入函數,把函數調用當成一條語句執行//(3)傳統多線程程序中,主線程要等待子線程執行完畢,然后自己才能向下執行//detach:分離,主線程不再與子線程匯合,不再等待子線程//detach后,子線程和主線程失去關聯,駐留在后臺,由C++運行時庫接管//myThread.detach();//(4)joinable()判斷是否可以成功使用join()或者detach()//如果返回true,證明可以調用join()或者detach()//如果返回false,證明調用過join()或者detach(),join()和detach()都不能再調用了if (myThread.joinable()){cout << "可以調用可以調用join()或者detach()" << endl;}else{cout << "不能調用可以調用join()或者detach()" << endl;}cout << "Hello World!" << endl;return 0;
}

1.2 join

join意為匯合,子線程和主線程回合

1.3 datch

detach:分離,主線程不再與子線程匯合,不再等待子線程
detach和join只能

1.4 joinable

joinable(): 判斷是否可以成功使用join()或者detach()。
如果返回true,證明可以調用join()或者detach()
如果返回false,證明調用過join()或者detach()

重要補充:
線程類參數是一個可調用對象
一組可執行的語句稱為可調用對象,c++中的可調用對象可以是函數函數指針lambda表達式bind創建的對象或者重載了函數調用運算符的類對象。

2. 其他創建線程的方法

2.1 用類 重載了函數調用運算符

創建一個類,并編寫圓括號重載函數,初始化一個該類的對象,把該對象作為線程入口地址

class Ta
{
public:void operator()() //不能帶參數{cout << "我的線程開始運行" << endl;//-------------//-------------cout << "我的線程運行完畢" << endl;}
};//main函數里的:
int main(){Ta ta;thread mytobj1(ta);//子進程mytobj1從ta開始執行mytobj1.join(); //等待子進程執行結束cout<<"I love China"<<endl;return 0;
}

問題案例(避免):

class TA{
public:int &m_i;//引用TA(int &i):m_i(i){}void operator() (){//不帶參數cout<<"m_i1的值為:"<<m_i<<endl;cout<<"m_i2的值為:"<<m_i<<endl;cout<<"m_i3的值為:"<<m_i<<endl;cout<<"m_i4的值為:"<<m_i<<endl;cout<<"m_i5的值為:"<<m_i<<endl;cout<<"m_i6的值為:"<<m_i<<endl;cout<<"m_i7的值為:"<<m_i<<endl;cout<<"m_i8的值為:"<<m_i<<endl;
}
int main(){int myi=6;TA ta(myi);thread mytobj2(ta);//ta:可調用對象mytobj2.detach();}

結果:

在這里插入圖片描述
分析:傳入子線程的是引用,使用detach后,主線程提前結束,釋放myi,子線程的值就會無效。

  • 一旦調用了detach(),那我主線程執行結束了,我這里用的這個ta這個對象還在嗎?〈對象不在)

  • 這個對象實際上是被復制到線程中去(調用拷貝構造函數) ﹔執行完主球程后,ta會被銷毀,但是所復制的TA對象依舊存在。

  • 所以,只要你這個TA類對象里沒有引用,沒有指針,那么就不會產生問題;

2.2 lambda表達式創建線程

int main(){auto mylamthrea=[]{cout << "我的線程開始運行" << endl;//-------------//-------------cout << "我的線程運行完畢" << endl;};thread myobj4(mylamthrea);myobj4.join();cout << "Hello World!" << endl;return 0;
}

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

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

相關文章

ubuntu 安裝 python3.9

一、 相關背景 之前在dockerfile里面一直使用的是python3.8&#xff08;忘記為什么選擇這個版本了&#xff09;&#xff0c;想用python3.9&#xff0c;因為覺得3.8有點老了&#xff0c;而且3.9一個重要的feature&#xff0c;是把list作為默認的類型&#xff0c;不需要從typing…

Redis數據結構——Redis簡單動態字符串SDS

定義 眾所周知&#xff0c;Redis是由C語言寫的。 對于字符串類型的數據存儲&#xff0c;Redis并沒有直接使用C語言中的字符串。 而是自己構建了一個結構體&#xff0c;叫做“簡單動態字符串”&#xff0c;簡稱SDS&#xff0c;比C語言中的字符串更加靈活。 SDS的結構體是這樣的…

Python-OpenCV中的圖像處理-視頻分析

Python-OpenCV中的圖像處理-視頻分析 視頻分析Meanshift算法Camshift算法光流 視頻分析 學習使用 Meanshift 和 Camshift 算法在視頻中找到并跟蹤目標對象: Meanshift算法 Meanshift 算法的基本原理是和很簡單的。假設我們有一堆點&#xff08;比如直方 圖反向投影得到的點&…

ASR 語音識別接口封裝和分析

這個文檔主要是介紹一下我自己封裝了 6 家廠商的短語音識別和實時流語音識別接口的一個包&#xff0c;以及對這些接口的一個對比。分別是&#xff0c;阿里&#xff0c;快商通&#xff0c;百度&#xff0c;騰訊&#xff0c;科大&#xff0c;字節。 zxmfke/asrfactory (github.c…

ubuntu 安裝 cuda

ubuntu 安裝 cuda 初環境與設備在官網找安裝方式 本篇文章將介紹ubuntu 安裝 CUDA Toolkit CUDA Toolkit 是由 NVIDIA&#xff08;英偉達&#xff09;公司開發的一個軟件工具包&#xff0c;用于支持并優化 GPU&#xff08;圖形處理器&#xff09;上的并行計算和高性能計算。它…

解析TCP/IP協議的分層模型

了解ISO模型&#xff1a;構建通信的藍圖 為了促進網絡應用的普及&#xff0c;國際標準化組織&#xff08;ISO&#xff09;引入了開放式系統互聯&#xff08;Open System Interconnect&#xff0c;OSI&#xff09;模型。這個模型包括了七個層次&#xff0c;從底層的物理連接到頂…

一、Dubbo 簡介與架構

一、Dubbo 簡介與架構 1.1 應用架構演進過程 單體應用&#xff1a;JEE、MVC分布式應用&#xff1a;SOA、微服務化 1.2 Dubbo 簡介一種分布式 RPC 框架&#xff0c;對專業知識&#xff08;序列化/反序列化、網絡、多線程、設計模式、性能優化等&#xff09;進行了更高層的抽象和…

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加載三維地球

目錄 SceneView類的常用屬性SceneView類的常用方法vue3中使用SceneView類創建三維地球項目準備引入ArcGIS API創建Vue組件在OnMounted中調用初始化函數initArcGisMap創建Camera對象Camera的常用屬性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加載和展示三維地…

【JavaSE】面向對象之封裝

封裝的概念 封裝是把過程和數據包圍起來&#xff0c;對數據的訪問只能通過已定義的接口。面向對象計算始于這個基本概念&#xff0c;即現實世界可以被描繪成一系列完全自治、封裝的對象&#xff0c;這些對象通過一個受保護的接口訪問其他對象。封裝是一種信息隱藏技術&#xff…

Java旋轉數組中的最小數字(圖文詳解版)

目錄 1.題目描述 2.題解 分析 具體實現 方法一&#xff08;遍歷&#xff09;&#xff1a; 方法二&#xff08;排序&#xff09;&#xff1a; 方法三&#xff08;二分查找&#xff09;&#xff1a; 1.題目描述 有一個長度為 n 的非降序數組&#xff0c;比如[1,2,3,4,5]&a…

Linux基礎

Linux 一、基礎01- 執行環境準備02- linux的版本分類02.1 內核版本02.2 發行版本02.3 內核和發行版本的區別: 03- 虛擬機安裝04- 啟動linux 二、系統操作05- 幫助命令05.1 man 幫助05.2 help 幫助05.2.1 內部命令05.2.2 外部命令 05.3 info 幫助 06- ls命令06.1 -r06.2 -rt06.3…

npm install 中 --save 和 --save-dev 是什么?

npm&#xff0c;全名 Node Package Manager&#xff0c;套件管理工具&#xff0c;package.json 會記下你在項目中安裝的所有套件。 假設在項目中安裝 lodash npm i --save lodash這樣在 dependencies 中會出現&#xff1a; 如果修改了導入方式&#xff1a; npm i --save-dev …

在Linux中對docker 一鍵安裝,本地安裝,無網絡安裝,

在Linux中對docker 一鍵安裝 前提先準備好安裝包 非常絲滑 首先先把需要準備的文件準備好&#xff0c;/package/base.tar 和 /package/docker-20.10.10.tgz包 這兩個文件包必須放在 /package目錄下 再和/package同級的目錄下再準備conf目錄&#xff0c;conf目錄下放docker.se…

Labview解決“重置VI:xxx.vi”報錯問題

文章目錄 前言一、程序框圖二、前面板三、問題描述四、解決辦法 前言 在程序關閉前面板的時候小概率型出現了 重置VI&#xff1a;xxx.vi 這個報錯&#xff0c;并且發現此時只能通過任務管理器殺掉 LabVIEW 進程才能退出&#xff0c;這里介紹一下解決方法。 一、程序框圖 程序…

特征選擇 | 遞歸特征消除算法篩選最優特征

特征選擇 | 遞歸特征消除算法篩選最優特征 目錄 特征選擇 | 遞歸特征消除算法篩選最優特征寫在前面常規方法算法原理結果分析參考資料 寫在前面 在實際應用中&#xff0c;特征選擇作為機器學習和數據挖掘領域的重要環節&#xff0c;對于提高模型性能和減少計算開銷具有關鍵影響…

pve7.2虛擬機 lvm磁盤擴容,增加硬盤操作

之前安裝pve時候只有256的ssd,最近安裝的虛擬機較多&#xff0c;給加塊閑置硬盤&#xff0c;順便學習一下&#xff0c;像pve這種虛擬機系統&#xff0c;硬盤應該可以像nas你這樣隨時增加&#xff0c;而不影響上層應用&#xff0c;我自己也是摸索著做。 一、安裝好硬盤后打開pv…

vue3+ts-tsconfig.json報錯Option ‘importsNotUsedAsValues’

vue3ts-tsconfig.json報錯Option ‘importsNotUsedAsValues’ is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption ‘“ignoreDeprecations”: “5.0”’ to silence this error. Use ‘verbatimModuleSyntax’ instead 自我記錄 翻譯 選項…

智能家居(2)---串口通信(語音識別)控制線程封裝

封裝語音線程&#xff08;語音通過串口和主控設備進行交流&#xff09;實現對智能家居中各種燈光的控制 mainPro.c(主函數) #include <stdio.h> #include "controlDevice.h" #include "inputCommand.h" #include <pthread.h>struct Devices …

echart 3d立體顏色漸變柱狀圖

如果可以實現記得點贊分享&#xff0c;謝謝老鐵&#xff5e; 1.需求描述 根據業務需求將不同的法律法規&#xff0c;展示不同的3d立體漸變柱狀圖。 2.先看下效果圖 3. 確定三面的顏色&#xff0c;這里我是自定義的顏色 // 右面生成顏色const rightColorArr ref(["#79D…

ComponentOne Studio ASP.NET MVC Crack

ComponentOne Studio ASP.NET MVC Crack FlexReport增強功能 添加了對在Microsoft Windows上部署Microsoft Azure的支持。 添加了對顯示嵌入字體的支持。 .NET標準版的經典C1PDF(Beta版) GrapeCity的經典C1Pdf庫現在提供了基于Microsoft.NET標準的版本。在任何.NET應用程序(包括…