【2】c++多线程技术之多线程标准库的使用

1、线程的构造与启动

在C++中,多线程有关的头文件为<thread>,我们可以使用std::thread类来创建和管理线程。下面是一个简单的示例代码:

cpp 复制代码
#include <iostream>
#include <thread>  // 包含线程库相关头文件
void thread_function() {
    std::cout << "Hello from the new thread!" << std::endl;
}
int main() {
    // 创建一个新线程并执行函数 thread_function
    std::thread t(thread_function);
    // 等待线程执行完成
    t.join();
    return 0;
}

在这个示例中,我们首先包含了头文件,以便我们可以使用std::thread类。然后,我们定义了一个名为print_hello的函数,这个函数将在新线程中执行。在main函数中,我们创建了一个名为t的新线程,并将print_hello函数作为参数传递给它。这将导致print_hello函数在新线程中执行。最后,我们调用了t.join()方法来等待线程完成。这是一个阻塞调用,意味着主线程将等待新线程完成后再继续执行。如果不调用join()方法,新线程将成为分离状态,这意味着当主线程结束时,新线程可能会继续运行。

2、线程的终止与析构

线程的终止和析构主要涉及到两个概念:线程的结束和线程对象的销毁。
线程的结束 :当线程的任务函数返回时,线程就会自动结束。如果需要在主线程中结束一个子线程,可以使用std::thread类的join()或detach()方法。join()方法会阻塞当前线程,直到被调用join()的线程结束。detach()方法则会将子线程设置为后台运行,主线程不会等待其结束。
线程对象的销毁:当一个std::thread对象被销毁时,如果该对象关联的线程仍在运行,程序会调用std::terminate()函数,导致程序异常终止。因此,需要确保在销毁std::thread对象之前,已经正确地结束了线程。

cpp 复制代码
#include <iostream>
#include <thread>
void thread_task() {
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread task running: " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}
int main() {
    // 创建一个线程对象t,关联到thread_task函数
    std::thread t(thread_task);
    // 等待线程t结束
    t.join();
    // 销毁线程对象t
    // 如果线程t还在运行,程序会调用std::terminate()函数,导致程序异常终止
    // 所以在实际使用中,需要确保在销毁std::thread对象之前,已经正确地结束了线程
    return 0;
}

3、std::thread::joinstd::thread::detach

std::thread::join:这个方法会阻塞当前线程,直到被调用的线程执行完毕。如果一个线程已经被join或者detach,再次调用这两个方法会导致程序终止。
std::thread::detach:这个方法将线程设置为"分离"状态,这意味着主线程不会等待这个线程结束。一旦线程结束,系统会自动回收其资源。
std::thread::join代码示例

cpp 复制代码
#include <iostream>
#include <thread>
void threadFunction() {
    std::cout << "Hello from thread!\n";
}
int main() {
    // 创建一个新线程
    std::thread t(threadFunction);
    // 使用join方法等待线程结束
    t.join();
    // 输出消息表示主线程继续执行
    std::cout << "Hello from main!\n";
    return 0;
}

std::thread::detach方法代码示例

cpp 复制代码
#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Hello from thread!\n";
}

int main() {
    // 创建一个新线程
    std::thread t(threadFunction);

    // 使用detach方法使线程在后台运行
    t.detach();

    // 输出消息表示主线程继续执行
    std::cout << "Hello from main!\n";

    return 0;
}

4、std::this_thread与当前线程操作

std::this_thread是C++标准库中的一个命名空间,它提供了一些与当前线程操作相关的函数和类。通过使用std::this_thread,我们可以获取当前线程的ID、设置线程名称、休眠线程等。下面是一个简单的示例代码,演示了如何使用std::this_thread来获取当前线程的ID和设置线程名称

cpp 复制代码
#include <iostream>
#include <thread>
#include <chrono>
void threadFunction() {
    // 获取当前线程的ID
    std::thread::id thisThreadId = std::this_thread::get_id();
    std::cout << "Current thread ID: " << thisThreadId << std::endl;
    // 设置当前线程的名称
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 休眠1秒,确保线程名称设置成功
    std::this_thread::set_name("MyThread");
    // 再次获取当前线程的ID
    thisThreadId = std::this_thread::get_id();
    std::cout << "Current thread ID after setting name: " << thisThreadId << std::endl;
}
int main() {
    // 创建一个新线程并执行threadFunction函数
    std::thread myThread(threadFunction);
    // 等待新线程执行完毕
    myThread.join();
    return 0;
}
相关推荐
White_Can23 分钟前
《C++11:智能指针》
c++·c++11·智能指针
无限进步_23 分钟前
【数据结构&C语言】对称二叉树的递归之美:镜像世界的探索
c语言·开发语言·数据结构·c++·算法·github·visual studio
im_AMBER36 分钟前
Leetcode 98 从链表中移除在数组中存在的节点
c++·笔记·学习·算法·leetcode·链表
CSDN_RTKLIB36 分钟前
C++取模与取余
开发语言·c++
星河耀银海1 小时前
C++开发入门——环境搭建与第一个程序
开发语言·c++·策略模式
_OP_CHEN2 小时前
【算法基础篇】(四十四)数论之欧拉定理与扩展欧拉定理深度解析:从降幂到超大规模幂运算
c++·算法·蓝桥杯·算法竞赛·欧拉定理·扩展欧拉定理·acm/icpc
liulilittle2 小时前
DeepWiki: OPENPPP2 工程价值
网络·c++·网络协议·ai·信息与通信·通信
星河耀银海2 小时前
C++面向对象编程:从基础到实战
开发语言·c++
Ccjf酷儿2 小时前
C++语言程序设计 (郑莉)第三章 函数
开发语言·c++
石去皿3 小时前
从本地知识库到“活”知识——RAG 落地全景指南
c++·python·大模型·rag