(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
发布日期:2021-05-07 15:19:48 浏览次数:6 分类:精选文章

本文共 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(),可以有效地管理多线程程序,提升性能和稳定性。

    上一篇:(C++11/14/17学习笔记):线程传参详解,detach()陷阱,成员函数做线程函数
    下一篇:(C++11/14/17学习笔记):并发基本概念及实现,进程、线程基本概念

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月04日 12时20分58秒