C++11/14线程--线程的创建与分离

本文介绍如何在C++11中创建和分离线程,包括使用std::thread进行线程创建的基本语法,以及如何通过join()和detach()来管理线程的生命周期。演示了线程创建和分离的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程的创建

让我们看看示例代码(t1.cpp).

#include <iostream>
#include <thread>

void thread_function()
{
    std::cout << "thread function\n";
}

int main()
{
    std::thread t(&thread_function);   // 线程 t 开始运行
    std::cout << "main thread\n";
    t.join();                          // 主线程等待子线程结束
    return 0;
}

代码在linux系统下将输出:

$ g++ t1.cpp -o t1 -std=c++11 -pthread
$ ./t2
thread function
main thread

我们要做的第一件事是创建一个线程对象(工作线程),并给它一个函数形式的任务进行工作。
主线程希望等待线程成功完成。
所以,我们使用join(). 如果最初的主线程不等待新线程执行完成,那么它会继续执行main()函数之后的代码,可能在新线程执行完毕前结束程序。


当主线程在等待时,主线程处于空闲状态。
实际上,操作系统可能会把CPU资源从主线程上移走。
请注意,我们在线程的函数和类的声明中有一个新的标准C++库头文件#include <thread>


下图是流程的流程图

这里写图片描述

然而,在实际执行中,事情并不是那么理想,更可能是不对称的。也许,它看起来更像下面这张图片。
这里写图片描述

当工作线程开始构造std::thread t的时候,可能会有创建时的开销(通过使用线程池可以减少此开销),图中虚线表示可能的阻塞状态。

线程的分离

我们可以创建一个新线程使其运行为自由的守护进程。

// t2.cpp
int main()
{
    std::thread t(&thread;_function);
    std::cout << "main thread\n";
    // t.join();
    t.detach();
    return 0;
}

分离的子线程现在是自由的,并自行运行。它变成了一个守护进程。

$ g++ t2.cpp -o t2 -std=c++11 -pthread
$ ./t2
main thread

注意,分离线程没有改变打印输出到标准输出stdout,因为主线程已经结束并退出。
这是多线程编程的特点之一:我们不能确定哪个线程首先运行 (不确定性,除非我们使用同步机制。). 在我们的例子中,由于创建一个新线程需要一定的时间,主线程最有可能比子线程率先执行完毕。


还有一点我们需要注意的是,即使在这个简单的代码中,我们也在共享一个公共资源:std::cout。
因此,为了使代码正常工作,主线程应该允许我们的子线程访问资源。
一旦一个线程分离,我们不能强迫它与主线程重新连接。因此,下面的代码行是错误的,程序会崩溃。

int main()
{
    std::thread t(&thread;_function);
    std::cout << "main thread\n";
    // t.join();
    t.detach();
    t.join();   // Error
    return 0;
}

一旦脱离,线程就应该永远是脱离状态.
我们可以使用joinable()把代码做崩溃前的检查。
因为它joinable()返回为false,join()函数不会被调用,程序运行不会崩溃。

int main()
{
    std::thread t(&thread;_function);
    std::cout << "main thread\n";
    // t.join();
    if(t.joinable()) 
        t.join(); 
    return 0;
}

原文地址:
http://www.bogotobogo.com/cplusplus/C11/1_C11_creating_thread.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值