C++中线程管控

1 启动线程

任何可调用线程都适用于thread,包括函数指针,lambda表达式,函数对象等;

一旦启动了线程就一定要确定是等待它结束还是与之分离;( std::terminate() 终止程序 );

一般要求每个线程的函数是自含(self-contain)的,这样就能防止某个局部变量声明周期已经结束,但是仍然有线程进行访问它造成不可控的错误;

2等待线程完成

调用join() 函数;每个线程只能调用一次join函数,只要调用过,线程就就不可再汇合( joinable() 返回值为false );

  • 在出现异常的情况下等待:如果发生异常而跳过了执行join() 可能导致不可预料的错误,因此,万一发生异常我们也要执行join来避免生存期的问题。

3 在后台运行不做等待

detach() 让线程在后台运行,其归属权和控制权都转移给C++运行时库(runtime library) 来保证一旦线程退出,与之关联的所有资源都会被回收;

cpp 复制代码
// 一个处理文件的例子
void edit_document(std::string const& filename)
{
    open_document_and_display_gui(filename);
    while(!done_editing())
    {
        user_command cmd=get_user_input();
        if(cmd.type==open_new_document)
        {
            std::string const new_name=get_filename_from_user();
            std::thread t(edit_document,new_name);
            t.detach();
        }
        else
        {
            process_user_input(cmd);
        }
    }
}

4 向线程传递参数

  • 线程函数的参数为 非const 引用的时候,不能直接传递左值,而是要用ref()转换成右值。
  • 当传入类的成员函数的时候,应该传入一个函数指针指向该成员函数,此外,还要给出合适的对象指针作为函数的第一个参数,(在调用类非静态成员函数的时候,编译器会隐式添加一个参数,它是所操作对象的地址,用于绑定对象和成员函数,且位于所有其他实际参数之前)
cpp 复制代码
// example 类调用函数,下面这两个句子是等价的
obj.func(2) 
example::func(&obj,2)

5 转移线程,集结成组

  • thread 对象 支持移动语义

6 识别线程

常用的api

  • std::thread::hardwave_concurrency() 返回值是一个指标,表示程序在各次运行中可真正并发的线程数量。
  • 线程ID所属的类型是std::thread::id, 可以通过get_id()和std::this_thread::get_id() 获得
相关推荐
Yyyyyy~8 分钟前
【java】运算符
java
古法安卓17 分钟前
Android-切换白天黑夜内存不足问题排查
android·java·android studio
Dreams_l23 分钟前
如何保证RabbitMQ消息可靠传输
java·rabbitmq·java-rabbitmq
MacroZheng26 分钟前
面试官皱眉:"你懂 Vibe Coding,那你说superpowers和grill-me怎么选?",我:"小孩才做选择,我全都要!"
java·人工智能·后端
大模型码小白28 分钟前
【AI大模型】DeepSeek Harness 深度解析:大模型评测框架的架构与实践
java·运维·人工智能·spring·架构·自动化
Mr.Java.34 分钟前
本地测试全绿,上线 SQL 报错?Spring Boot 容器级 DT 测试实战指南(附Skills)
java·测试用例·springboot·testcontainers·dt·java测试skills·dt测试
维天说1 小时前
Agent会听人话,反而更难管
java·开发语言·人工智能
SamDeepThinking1 小时前
if嵌套最好控制在3层以内
java·后端·程序员
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day36|阿里云 OSS 文件上传、Spring 事务、全局异常思维导图复盘
java·学习·阿里云
苏渡苇1 小时前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
java·后端·spring·spring cloud·springboot·性能监控