博客
关于我
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
阅读量:339 次
发布时间:2019-03-04

本文共 2070 字,大约阅读时间需要 6 分钟。

线程的启动、结束,创建线程的多种方法以及join、detach等操作是C++多线程编程中的重要内容。以下是对这些操作的详细解释和实例分析。

线程启动、结束,创建线程的多法

在C++中,线程的创建和管理主要通过thread类来实现。以下是几种常见的创建线程的方式:

  • 直接使用thread构造函数

    thread mythread(function_name);

    这种方式直接创建一个线程,并让function_name作为线程的起点函数执行。如果function_name是可调用对象(如函数或lambda表达式),则线程就会立即执行。

  • 使用joinable()检查线程状态:在使用join()detach()之前,需要先检查线程是否处于可等待状态。可以通过joinable()函数来判断:

    if (mythread.joinable()) {    // 可以使用join()或detach()} else {    // 线程已处于不可等待状态,无法使用join()或detach()}
  • 使用join()等待线程完成

    mythread.join();

    join()函数会阻塞主线程,等待线程执行完毕。如果线程已经完成,join()立即返回,否则主线程会被阻塞直到线程结束。

  • 使用detach()分离线程

    mythread.detach();

    detach()函数将使线程与主线程解耦。线程将作为后台线程独立运行,主线程不再阻塞,继续执行后续代码。

  • 线程启动的示例

    以下是一个典型的线程启动和等待示例:

    #include 
    #include
    #include
    using namespace std;void myprint() { cout << "我的线程开始执行了" << endl; // 假设有其他操作 cout << "我的线程结束运行了" << endl;}int main() { thread mythread(myprint); mythread.join(); cout << "主线程收尾" << endl; return 0;}

    运行结果会显示“主线程收尾”是在线程完成后输出的,因为join()确保了线程执行完毕后才会继续。

    线程管理的具体操作

  • join()的作用join()函数用于等待线程完成,确保主线程不会在子线程未完成前继续执行。这样可以避免资源竞争和数据不一致的问题。

  • detach()的作用detach()函数用于将线程从主线程中分离,使其成为后台线程。主线程不再等待子线程,子线程也无需等待主线程。这在多个线程同时运行时非常有用,可以提高主线程的执行效率。

  • joinable()的使用joinable()函数用于检查线程是否处于可等待状态,确保在调用join()detach()之前线程是活跃的。例如:

    if (mythread.joinable()) {    cout << "线程是可等待的" << endl;} else {    cout << "线程已处于不可等待状态" << endl;}
  • 其他创建线程的手法

    除了直接使用thread构造函数,还可以通过类对象或lambda表达式来创建线程:

  • 使用类对象作为可调用对象

    class AE {public:    void operator() {        cout << "AE线程开始执行了" << endl;        // 假设有其他操作        cout << "AE线程结束运行了" << endl;    }};int main() {    AE ae;    thread mythread(ae);    mythread.join();    cout << "主线程收尾" << endl;    return 0;}
  • 使用lambda表达式

    int main() {    auto lambda = []() {        cout << "lambda线程执行了" << endl;        // 假设有其他操作        cout << "lambda线程结束运行了" << endl;    };    thread mythread(lambda);    mythread.join();    cout << "主线程收尾" << endl;    return 0;}
  • 注意事项

    • 资源管理:即使使用detach(),线程的资源管理仍由运行时库负责,主线程不需要手动等待。
    • 互斥使用join()detach()不能在同一个线程上重复调用,否则会抛出错误。
    • 线程安全:在线程中使用共享资源时,必须确保其正确的保护机制,避免竞态条件和死锁。

    通过合理使用join()detach(),可以有效地管理多线程程序,提升性能和稳定性。

    转载地址:http://obyr.baihongyu.com/

    你可能感兴趣的文章
    小程序开发之第三天
    查看>>
    某易游戏经典吃豆豆动画404页面源码
    查看>>
    专升本——英语视频学习
    查看>>
    Future education software
    查看>>
    C语言——经典200道实例【基础例题100道——进阶例题100道】
    查看>>
    数据结构——线性表&树&图的【数据元素名称-有无结点-内部之间的关系】的区别
    查看>>
    不知道考研各科课程那个老师的课好?怎么选择安排?在哪找课程课本资料?看这里
    查看>>
    考研高数一_高数二_高数三考试大纲
    查看>>
    【无线传感器网络简明教程-学习笔记8】第八章 无线传感器网络试验
    查看>>
    【考研高数-高等数学-基础】第四章 不定积分
    查看>>
    【考研高数-高等数学-基础】第六章 定积分的应用
    查看>>
    【考研英语-基础-简单句】简单句的核心变化_谓语情态
    查看>>
    【考研英语-基础-简单句】简单句的核心变化_谓语否定与强调_考场攻略
    查看>>
    基于CC2530的跑马灯实验
    查看>>
    17级软件技术二班刘鑫磊安卓学期总结
    查看>>
    配置Log4j详细版
    查看>>
    数据结构 第五章 二叉树-1
    查看>>
    [Easy] 58. Length of Last Word
    查看>>
    [Easy] 100. Same Tree
    查看>>
    [Easy] 136. Single Number
    查看>>