首页 > 编程语言 >C++11 多线程< 一>、介绍

C++11 多线程< 一>、介绍

时间:2023-09-30 09:34:36浏览次数:40  
标签:11 std include cout t2 C++ t1 线程 多线程

  

 1 #include <iostream>
 2 #include <thread>
 3 
 4 void fun1()
 5 {
 6     std::cout << "fuck"  << std::endl;
 7 }
 8 
 9 int main() // 主线程
10 {
11     std::thread t1(fun1); // t1 线程
12     //t1.join(); // 主线程和t1互不干扰,fun1执行
13 
14     t1.detach();//  主线程太快,fun1没执行,
15 
16     // 一个线程被detach之后,不能再join
17     if (t1.joinable())
18     {
19         t1.join();
20     }
21 
22     return 0;
23 }

 

 1 //
 2 // Created by sry on 2021/7/5.
 3 //
 4 #include <iostream>
 5 #include <thread>
 6 
 7 /*
 8  *
 9  * 线程管理
10  *
11  * */
12 
13 void fun1()
14 {
15     std::cout << "fuck"  << std::endl;
16 }
17 
18 int main() // 主线程
19 {
20     std::thread t1(fun1); // t1 线程
21 
22     // 主线程执行一下内容
23     for (int i = 0; i < 100; ++i)
24     {
25         std::cout << "str = " << i << std::endl;
26     }
27 
28 
29     t1.join(); // 主线程和t1互不干扰,fun1执行
30 
31     return 0;
32 }
类中添加一个参数,然后构造一个线程:
 1 //
 2 // Created by sry on 2021/7/5.
 3 //
 4 #include <iostream>
 5 #include <thread>
 6 
 7 /*
 8  *
 9  * 线程管理
10  *
11  * */
12 
13 void fun1()
14 {
15     std::cout << "fuck"  << std::endl;
16 }
17 
18 class  MyCl
19 {
20 public:
21     void operator()(std::string& msg)
22     {
23         for (int i = 0; i < 100; ++i) {
24             std::cout << "from t1   " <<  i << std::endl;
25           }
26     }
27 
28 };
29 
30 int main() // 主线程
31 {
32     MyCl mc;
33     std::string msg = "shiruiyu";
34     std::thread t1((MyCl()), msg); // t1 线程,类中添加一个参数,然后构造一个线程
35 
36     try
37     {
38         // 主线程执行一下内容
39         for (int i = 0; i < 100; ++i)
40         {
41             std::cout << "str = " << i << std::endl;
42         }
43     }
44     catch (...)
45     {
46         t1.join();
47         throw;
48     }
49     return 0;
50 }
View Code

  多线程中的值传递与引用传递,在main函数中,砸门要将参数msg和类MyCl一起构成线程t1,其中msg采用引用传递,必须做到两点:我都标红加粗了。

 1 //
 2 // Created by sry on 2021/7/5.
 3 //
 4 #include <iostream>
 5 #include <thread>
 6 
 7 /*
 8  *
 9  * 线程管理
10  *
11  * */
12 
13 void fun1()
14 {
15     std::cout << "fuck"  << std::endl;
16 }
17 
18 class  MyCl
19 {
20 public:
21     void operator()(std::string& msg)
22     {
23         std::cout << "from t1   "  << std::endl;
24         msg = "shiruiyu2";
25     }
26 
27 };
28 
29 int main() // 主线程
30 {
31     MyCl mc;
32     std::string msg = "shiruiyu1";
33     std::thread t1((MyCl()), std::ref(msg)); // t1 线程,类中添加一个参数,然后构造一个线程
34 
35     std::cout << "from main "  << std::endl;
36 
37     std::cout << "msg = " << msg  << std::endl; // shiruiyu1
38     t1.join();
39     std::cout << "msg = " << msg  << std::endl; // shiruiyu2
40     return 0;
41 }

c++多线程编程:join()函数与detch()函数的区别:

参考:https://blog.csdn.net/liunan199481/article/details/83055901

   线程只能被转移,不能被复制。

1 // error:线程只能被转移,不能被复制
2 //std::thread t2 = t1;
3 // 正确写法,转移线程
4 std::thread t2 = std::move(t1);
5 // 都转移了,这里join也要改为t2
6 t2.join(); // 理解为加入主线程

   输出主线程、其他线层ID

1 std::cout << "t1 thread = " << t1.get_id() << std::endl;
2 std::thread t2 = std::move(t1);
3 std::cout << "t2 thread = " << t2.get_id() << std::endl;
4 // 都转移了,这里join也要改为t2
5 t2.join(); // 理解为加入主线程
6 std::cout << "main thread = " << std::this_thread::get_id() << std::endl;

打印结果(1、t1转移到t2,ID不变;2、第2行代码要是放到第5行之后,打印显示线层不存在,表明执行t2.join之后,t2线程就销毁了):

t1 thread = 140545623889664
t2 thread = 140545623889664
from t1   
main thread = 140545641916224
// 获取CPU下线程数量
int n = std::thread::hardware_concurrency();

标签:11,std,include,cout,t2,C++,t1,线程,多线程
From: https://www.cnblogs.com/feiyull/p/14972100.html

相关文章

  • Leetcode 1143. 最长公共子序列
    https://leetcode.cn/problems/longest-common-subsequence/description/?envType=study-plan-v2&envId=top-100-liked给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回0。一个字符串的子序列是指这样一个新的字符串:它......
  • 如何延长window11更新信息?
    前言日常使用电脑的时候,我们总是会遇到一个很常见的问题:如何关闭windows自动更新。解决方法一:暂停更新解决方法二:打开注册表:运行=>regedit进入:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings新建一个名为FlightSettingsMaxPauseDays的属性,类型为......
  • 20211314王艺达学习笔记4
    学习总结第七章文件操作文件操作级别(1)硬件级别fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件(2)操作系统内核中的文件系统函数前缀为k表示内核函数(3)系统调用open()、read()、lseek()、close()open()、......
  • QML中使用C++对象
    QML中使用C++对象原文链接:(60条消息)QtQuick之QML与C++混合编程详解_qmlc++_foruok的博客-CSDN博客QtQuick技术的引入,使得你能够快速构建UI,具有动画、各种绚丽效果的UI都不在话下。但它不是万能的,也有很多局限性,原来Qt的一些技术,比如低阶的网络编程如QTcpSoc......
  • pybind11
    fatalerror:Python.h:nosuchfileordirectory在使用pybind11时,如果不做调整可能就会出现这样的情况,Python.h一般出现在usr/include/pythonx.x文件夹中,而include路径默认情况下只会包含usr/include,所以我们只需要添加include路径即可。ctrl+shift+p打开C/C++editconfigu......
  • ABC211D Number of Shortest paths
    分析一道显然的最短路,用dijkstra算法。计算最短路的同时,保存最短路个数,如果与当前最短路相同,最短路个数相加,否则到这个节点的最短路个数为上一个节点的最短路个数。AcceptedCode#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;constintmod=1e9......
  • C++友元和运算符重载
    友元classbuiding{friendvoidGoodboy(buiding*bui);public:intm_age;private:intm_size;};//全局函数voidGoodboy(buiding*bui){cout<<bui->m_age<<endl;//可以调用public中的m_agecout<<bui->m_size<<endl;//m_size调用需要声明友元}私有......
  • 爬虫记录~(多线程爬取图片)
    使用Requests+Re库方法多线程爬取亚马逊商城商品图片,以关键词“书包”搜索页面的商品的图片,爬取0-2页面商品图片。关键词:多线程爬虫程序、商城网站的遍历,链接的查找和访问。巩固搜索接口和翻页处理。importrequestsfromfake_useragentimportUserAgentimportrefrommulti......
  • 结对项目:用C++实现四则运算
    软工作业3:自动生成小学四则运算题目的命令行程序这个作业属于哪个课程计科21级12班这个作业要求在哪里结对项目这个作业的目标熟悉合作开发流程项目Github点击这里团队成员姓名学号石云欣3221004809沈纪康3121004750PSP表PSP2.......
  • 10分钟巩固多线程基础
    10分钟巩固多线程基础前言多线程是并发编程的基础,本篇文章就来聊聊多线程我们先聊聊概念,比如进程与线程,串行、并行与并发再去聊聊线程的状态、优先级、同步、通信、终止等知识进程与线程什么是进程?操作系统将资源分配给进程,使用进程进行调度,但进程遇到阻塞任务时,为了提升CP......