IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++学习日记13——多线程 -> 正文阅读

[C++知识库]C++学习日记13——多线程

学习视频链接

c++11并发与多线程视频课程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Yb411L7ak?p=4&spm_id_from=333.1007.top_right_bar_window_history.content.click

目录

一、C++11多线程

1.1 为什么引入多线程

二、线程简单的创建和操作

2.1 创建一个线程的步骤

2.2 代码

2.3 注意

2.4 detach() 用法

2.5?joinable() 用法

三、线程其他的创建方法

3.1 使用仿函数


一、C++11多线程

1.1 为什么引入多线程

跨平台,可移植性好

二、线程简单的创建和操作

2.1 创建一个线程的步骤

1、包含头文件 thread

2、写初始函数

3、在 main 中创建 thread

2.2 代码

#include <iostream>
#include <string>
#include <thread>
using namespace std;

void myprint()
{
    cout << "2. 子线程开始运行" << endl;
    
    // 执行其他代码 ...

    cout << "2. 子线程开始运行" << endl;
};

int main(void)
{
    cout << "1. 主线程开始运行" << endl;

    thread mytobj(myprint);  // 创建子线程
    mytobj.join();           // 阻塞等待子线程结束运行

    cout << "1. 子线程被回收" << endl;

    return 0;
}

2.3 注意

1、整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止

2、主线程需要阻塞等待回收子线程或者使用 detach() 使子线程失去主线程的控制

2.4 detach() 用法

1、测试函数

#include <iostream>
#include <string>
#include <thread>
using namespace std;

void myprint()
{
    cout << "2. 子线程开始运行" << endl;
    
    cout << "2. 我爱中国 1" << endl;
    cout << "2. 我爱中国 2" << endl;
    cout << "2. 我爱中国 3" << endl;
    cout << "2. 我爱中国 4" << endl;
    cout << "2. 我爱中国 5" << endl;
    cout << "2. 我爱中国 6" << endl;

    cout << "2. 子线程结束运行" << endl;
};

int main(void)
{
    cout << "1. 主线程开始运行" << endl;

    thread mytobj(myprint);  // 创建子线程
    mytobj.detach();

    cout << "1. I love China 1" << endl;
    cout << "1. I love China 2" << endl;
    cout << "1. I love China 2" << endl;
    cout << "1. I love China 3" << endl;
    cout << "1. I love China 4" << endl;
    cout << "1. I love China 5" << endl;
    cout << "1. I love China 6" << endl;

    cout << "1. 主线程结束运行" << endl;

    return 0;
}

2、注意

两个进程并行执行,但是主线程一旦结束了,子线程就不能往控制台输出字段了

一旦调用了 detach(),就不能再用 join(),否则系统会报告异常

2.5?joinable() 用法

1、作用

joinable() 判断是否可以成功使用 join() 或者 detach();如果返回 true,证明可以调用 join() 或者detach();如果返回 false,证明调用过 join() 或者 detach(),join() 和 detach() 都不能再调用了

2、代码

#include <iostream>
#include <string>
#include <thread>
using namespace std;

void myprint()
{
    cout << "2. 子线程开始运行" << endl;

    cout << "2. 子线程结束运行" << endl;
};

int main(void)
{
    cout << "1. 主线程开始运行" << endl;

    thread mytobj(myprint);  // 创建子线程
    if (mytobj.joinable())
    {
        cout << "可以调用可以调用join()或者detach()" << endl;
    }
    else
    {
        cout << "不能调用可以调用join()或者detach()" << endl;
    }

    mytobj.join();

    if (mytobj.joinable())
    {
        cout << "可以调用可以调用join()或者detach()" << endl;
    }
    else
    {
    cout << "不能调用可以调用join()或者detach()" << endl;
    }


    cout << "1. 主线程结束运行" << endl;

    return 0;
}

?

三、线程其他的创建方法

3.1 使用仿函数

1、函数代码

#include <iostream>
#include <string>
#include <thread>
using namespace std;

class TA
{
public:
    void operator()()
    {
        cout << "2. 子线程 operator() 开始执行了" << endl;
    }
};

int main(void)
{
    cout << "1. 主线程开始运行" << endl;
    
    TA ta;

    thread mytobj(ta);

    mytobj.join();

    cout << "1. 主线程结束运行" << endl;

    return 0;
}

?

2、注意事项1

不能传入父进程的局部变量,当父进程结束后,相应的内存会被释放

#include <iostream>
#include <string>
#include <thread>
using namespace std;

class TA
{
public:
    TA(int& i):m_i(i) { }
    void operator()()
    {
        cout << "2. (1)m_i的值为:" << m_i << endl;
        cout << "2. (2)m_i的值为:" << m_i << endl;
        cout << "2. (3)m_i的值为:" << m_i << endl;
        cout << "2. (4)m_i的值为:" << m_i << endl;
        cout << "2. (5)m_i的值为:" << m_i << endl;
        cout << "2. (6)m_i的值为:" << m_i << endl;
    }
public:
    int& m_i;
};

int main(void)
{
    cout << "1. 主线程开始运行" << endl;
    
    int i = 5;
    TA ta(i);

    thread mytobj(ta);

    mytobj.detach();

    cout << "1. (1)主线程正在运行" << endl;
    cout << "1. (2)主线程正在运行" << endl;
    cout << "1. (3)主线程正在运行" << endl;
    cout << "1. (4)主线程正在运行" << endl;
    cout << "1. (5)主线程正在运行" << endl;
    cout << "1. (6)主线程正在运行" << endl;

    cout << "1. 主线程结束运行" << endl;

    return 0;
}

2、注意事项2

传入的 ta 对象实际上是被子线程复制了一份,父线程结束后只是销毁了父线程里面的 ta 对象

#include <iostream>
#include <string>
#include <thread>
using namespace std;

class TA
{
public:
    TA(int& i):m_i(i) {
        cout << "2. TA()构造函数被执行" << endl;
    }
    TA(const TA& ta) :m_i(ta.m_i) {
        cout << "2. TA()拷贝构造函数被执行" << endl;
    }
    ~TA() {
        cout << "2. TA()析构函数被执行" << endl;
    }
    void operator()()
    {
        cout << "2. (1)子线程正在运行" << endl;
        cout << "2. (2)子线程正在运行" << endl;
        cout << "2. (3)子线程正在运行" << endl;
        cout << "2. (4)子线程正在运行" << endl;
        cout << "2. (5)子线程正在运行" << endl;
        cout << "2. (6)子线程正在运行" << endl;
    }
public:
    int& m_i;
};

int main(void)
{
    cout << "1. 主线程开始运行" << endl;
    
    int i = 5;
    TA ta(i);

    thread mytobj(ta);

    mytobj.detach();

    cout << "1. (1)主线程正在运行" << endl;
    cout << "1. (2)主线程正在运行" << endl;
    cout << "1. (3)主线程正在运行" << endl;
    cout << "1. (4)主线程正在运行" << endl;
    cout << "1. (5)主线程正在运行" << endl;
    cout << "1. (6)主线程正在运行" << endl;

    cout << "1. 主线程结束运行" << endl;

    return 0;
}

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:00:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 23:36:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码