码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++】多线程的学习笔记——白话文版(bushi


    目录

    下一章内容

    为什么要使用多线程

    例子

    代码

    结果

    首先要先学的库——thread库

    thread的简介

    thread的具体使用方法

    基本变量的定义

    注意(小重点)

    join函数的解读(重点)

    detach函数的解读

    注意

    关于vector和thread是联合使用

    例子中代码的改良

    代码

    运行结果

    总结

    是不是少了什么?


    下一章内容

    【C++】多线程的学习笔记(2)——白话文版(bushi-CSDN博客lock_guard是模板类,对比于mutex的区别是lock_guard在创建时会尝试获得锁的所有权(注意时尝试,如果获取不到就相当于没有用,并且不会报错),在作用域结束时会自动析构,无需手动解锁该类不可中途上锁和解锁,不可复制unique_lock的用法和lock_guard的用法类似,主要的区别在于他可以中途上锁以及解锁对比于lock_guard会更加的灵活但是所需要的内存空间会更大同时它的也有adopt_lock参数用法一样,而且他还拥有其他的第二参数。https://blog.csdn.net/mumuemhaha/article/details/133554220?spm=1001.2014.3001.5501

    为什么要使用多线程

    在我们实际处理问题中可能会遇到一些需要等待或者是需要时间去等待放回的问题

    比如像网络爬虫的数据包返回,亦或者程序对cpu的使用率不高,导致时间和性能的浪费

    同时多线程可以实现异步编程,将一些耗时的操作放在后台线程执行,使得主线程能够继续响应用户的其他操作,提高程序的并发性。

    综上所述,多线程编程对于我们大部分编程语言的学习都是必须要学习的。

    例子

    在这里我先放一个源代码在这,这是我们用原先的方法进行顺序执行

    代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void F_1(int i) {
    6. this_thread::sleep_for(chrono::seconds(i));//设定程序需要运行的时间
    7. cout << "The No."<" is finish" << endl;
    8. }
    9. int main() {
    10. clock_t now_time_1 = clock();//记录刚刚开始的时间
    11. cout << "This project is start!" << endl;
    12. for (int i = 1; i <= 3; i++) {
    13. F_1(i);
    14. }
    15. cout << "This project is ready!" << endl;
    16. clock_t now_time_2 = clock();//记录最后结束的时间
    17. cout << "The cost time is " << now_time_2 - now_time_1 <<" ms " << endl;
    18. }

     其中time.h库中的clock_t以及clock()是是用来统计程序运行的时间的

    this_thread::sleep_for(chrono::seconds(i))这个函数是个休眠函数,为等待i秒,用来模拟程序运行的时间

    结果

    程序运行的结果

    如图程序一共运行了6000ms的时间 

    首先要先学的库——thread库

    thread的简介

    C++ 作为一种强大的编程语言,为多线程编程提供了丰富而灵活的支持。C++ 的标准库提供了  头文件,其中包含了用于创建、启动和管理线程的类和函数。通过使用这些多线程库和功能,开发人员可以轻松地引入并发性到自己的应用程序中,实现多线程的并行处理。

    thread的具体使用方法

    基本变量的定义

    thread函数中定义线程的语法规如下

    std::thread 变量名 (函数,传递的参数1,传递的参数2,传递的参数3...)【如果前面加了using namespace std;可以删除std::】
    注意(小重点)

    其中如果原函数传递的参数为左值(也就是int &a)那么传递的参数应该把原来的a,b...改为ref(a),ref(b)或者cref(a),cref(b)...

    原因是thread为右值传递,函数讲道理应该不能用引用也就是右值。

    至于啥是左值啥是右值?

    简单来说就是左值是内存上有空间或者是有地址的,而右值就是内存上没空间或者是只有临时地址的,举个例子

    1. int a=1;//a为左值,1为右值
    2. int b=a+1;//b为左值,a+1为右值(注意)
    3. int& c=b;//可以,因为a为左值,在内存上有空间
    4. int& d=10//不可以,因为10为右值,在内存上面没有空间

    那为什么ref以及cref可以呢?

    • ref可以包装按引用传递的值为右值。
    • cref可以包装按const引用传递的值为右值。

    他们都是经过从左值转为右值的转化的(但是实际还是左值)

    join函数的解读(重点)

    join函数就是等待副线程完毕才可以进行join()函数下面的部分

    join函数看起来是加入,有一些人(包括我)把它看成加入线程池,其实我觉得把它换成wait其实更好一点......,因为join简单来说就是堵塞主线程,一直到函数运行完毕才可以进行下一步

    简单来说就是这样一个图

    这样看就是很完整了,不然如果是运行join()才加入的话,那样运行时间和上面代码没什么区别......

    detach函数的解读

    detach函数就是比较简单的

    笼统的来说:就是把它和主线程分离,两人谁也不等谁(但是其实主线程结束后,副线程由于守护线程的结束也会停止)

    注意

    如果你不使用或者是多次使用join或者detach两个中的一个函数,程序都会报错

    关于vector和thread是联合使用

    代码

    1. vector sum_1;
    2. sum_1.push_back(thread(F_1, 1));

    如上使用就可以了

    join函数就可以这样使用

    sum_1[0].join();

    例子中代码的改良

    那么例子中提到的代码就可以进行修改了

    代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. void F_1(int i) {
    7. this_thread::sleep_for(chrono::seconds(i));//设定程序需要运行的时间
    8. cout << "The No."<" is finish" << endl;
    9. i++;
    10. }
    11. int main() {
    12. clock_t now_time_1 = clock();
    13. cout << "This project is start!" << endl;//记录刚刚开始的时间
    14. vector sum_1;
    15. for (int i = 1; i <= 3; i++) {
    16. sum_1.push_back(thread(F_1, i));
    17. }
    18. for (int i = 0; i <= sum_1.size() - 1; i++) {
    19. sum_1[i].join();
    20. }
    21. //for (int i = 1; i <= 3; i++) {
    22. // thread t(F_1, i);
    23. //}
    24. cout << "This project is ready!" << endl;//记录结束的时间
    25. clock_t now_time_2 = clock();
    26. cout << "The cost time is " << now_time_2 - now_time_1 <<" ms " << endl;
    27. }

    代码中创建的一个容器进行装载三个线程

    然后创建过程中已经一起执行了

    运行结果

     如图,为3015ms,节约的时间十分的可观

    总结

    在编程中多线程操作一般可以节约可观的时间,并且可以对自己的程序进行一些优化

    尽管现在只学了thread库,但是不要担心

    接下来我会按照我的学习路线依次把我的学习笔记给写下来

    是不是少了什么?

    哦,对了

  • 相关阅读:
    Mysql查看慢查询日志
    rsync 远程同步
    手刻 Deep Learning -第壹章-PyTorch入门教学-基础概念与再探线性回归
    小艺的英文名编程求助(帮忙检查)
    主流电商平台价格如何高频监测
    关于windows上运行bitsandbytes老是报错的(说cuda版本有问题)解决方案
    多分类问题的precision和recall以及F1 scores的计算
    十大经典排序之归并排序
    计算机毕业论文java毕业设计成品源码网站strust2+mybatis新能源汽车车辆采购系统[包运行成功]
    C#中的事件聚合器实现方法
  • 原文地址:https://blog.csdn.net/mumuemhaha/article/details/133468825
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号