• 一文读懂 C++ 并发与多线程 独家原创


    目录

    一、基本概念

    二、线程创建以及 join() detach() 的区别

    三、线程传参

    四、各种锁

    五、future


    网上说的不清不楚的,自己写一篇。

    一、基本概念

    并发,就是几个任务同时进行。单核 CPU 的“并发”是假的,只是任务快速切换给人感觉像并行,实际是串行。多核 CPU 才会真正并行。当然,任务数 > CPU 核数还是会有切换的情况,比如 windows 上的任务(线程)都是上千个。

    一个可执行程序执行起来就是一个进程,一个进程只能有一个主线程。线程也不是越多越好,每个线程需要独立的堆栈空间,线程切换也要保存很多中间状态。

    如何实现并发?多进程或多线程。但优先使用多线程,因为一个进程中所有线程共享地址空间,还有诸如全局变量、指针、引用都可以在线程间传递,开销远小于多进程。

    二、线程创建以及 join() detach() 的区别

    线程创建直接使用 thread 库:

    thread thread1(fun1);

    这样会创建名字叫 thread1 的线程,调用函数 fun1(),注意,立即执行。 不像 java 里还要 start() 哦!

    join() 和 detach() 的区别见下面代码注释,不赘述。

    1. #include
    2. #include
    3. using namespace std;
    4. void fun1()
    5. {
    6. cout << "开始执行fun1()" << endl;
    7. }
    8. void fun2(int x)
    9. {
    10. cout << "开始执行fun2(), " << "x=" << x << endl;
    11. }
    12. int main() {
    13. cout << "主线程已经开始" << endl;
    14. // 创建线程,会立即执行
    15. thread thread1(fun1);
    16. thread thread2(fun2, 666);
    17. thread1.join(); // join() 代表汇合,阻塞的作用,主线程在这里等待子线程执行完毕
    18. thread2.join();
    19. // 如果使用detach(),则主线程与子线程分离,主线程不会等待子线程
    20. // 使用detach()主线程执行完了return 0, 程序终止子线程也没了,因此join()阻塞的方式更常用
    21. // thread1.detach();
    22. cout << "主线程马上结束" << endl;
    23. return 0;
    24. }

    上述代码执行结果:

    1. 主线程已经开始
    2. 开始执行fun1()
    3. 开始执行fun2(), x=666
    4. 主线程马上结束

    thread1 是否一定比 thread2 先执行完毕,不一定。thread1 是比 thread2 先启动,但两者是并行执行的,理解这个就理解了多线程核心。

    不写 join() 可不可以,不可以。那样可能主线程执行完了,子线程还没执行完,但是由于进程退出,子线程也中途停止了。

    还有一个 joinable() 函数也有一定作用,可以判断你是否调用过 join() 或者 detach()。

    三、线程传参

    工作太紧张,未完待续...

    四、各种锁

    五、future

  • 相关阅读:
    【C语言入门数据结构3】链表之单链表
    基于云原生存储的容器持久化存储方案
    优雅的使用token
    React之Hooks基础
    安装 node 错误的配置环境变量之后使用 npm 报错
    Linux上:安装、网络配置
    数组20—pop() :从数组末尾删除一个元素
    字符串定义
    Redis 内存管理
    百度前端二面常考手写面试题总结
  • 原文地址:https://blog.csdn.net/weixin_36389889/article/details/126068716