博客
关于我
(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/

    你可能感兴趣的文章
    深入理解数组指针与指针数组的区别
    查看>>
    iOS客户端与PHP服务端的简单交互
    查看>>
    Python的异常处理
    查看>>
    紫书——蛇形填数
    查看>>
    刷题计划1——poj1753
    查看>>
    第一场
    查看>>
    蓝桥杯备战——刷题(2019)
    查看>>
    未定义的变量“py”或函数“py.command”
    查看>>
    我们,都一样......(句句入心)
    查看>>
    总结了一下c/c++函数和变量的命名规则
    查看>>
    关于构造函数内调用虚函数的问题
    查看>>
    最短路径问题—Dijkstra算法
    查看>>
    求二叉树的深度
    查看>>
    录音功能
    查看>>
    c++面经基础知识汇总(类型转换、new/delete/malloc/free、什么是RTTI)
    查看>>
    mysql时间相关函数和操作
    查看>>
    万物皆可爬系列查看翻页翻到最后是什么
    查看>>
    python scrapy
    查看>>
    pymongo的使用
    查看>>
    A Guide to Node.js Logging
    查看>>