C++ thread编程(Linux系统为例)—thread成员函数

news2024/10/7 16:25:04

c++ 11 之后有了标准的线程库:std::thread。
参考thread库的使用

构造函数

thread的构造函数有下面四个重载

默认构造函数

thread() noexcept

初始化构造函数

template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);

该函数使用可变参数模板来构造一个线程对象,用来代表一个新的可join的执行线程。这个执行线程通过可变参数传入线程函数对象fn,以及函数的参数列表(可以简单理解为通过传值的方式将参数传给该构造函数)

拷贝构造函数

thread (const thread&) = delete;

线程不支持拷贝构造

移动构造

thread(thread&&x) noexcept;

转移参数x所代表的可执行指令的所有权,而不会影响线程的执行,转移后,参数x不再代表任何执行线程。

析构函数

析构函数用于销毁线程,如果这个线程是可以join的,那么析构函数会调用terminate()函数来终止线程。在thread对象被销毁之前应该尽可能将其join或者detach,以防止执行线程因为对象销毁而终止。

#include<iostream>
#include<thread>
#include<unistd.h>
using namespace std;
void printtHelloWorld(){
    while(true){
        cout<<"hello world"<<endl;
        sleep(1);
    }
}

int main(){
    thread t1(printtHelloWorld);
    sleep(3);
    t1.~thread();
    return 0;
}

在这里插入图片描述

operator=

thread& operator= (thread&& rhs) noexcept;
thread& operator= (const thread&) = delete;

thread对象不允许拷贝构造,同样的对于赋值操作符的重载实质是移动赋值。


#include<iostream>
#include<thread>
using namespace std;
void printHelloWorld(){
    cout<<"Hello World!"<<endl;
}
int main(){
    thread t1;
    t1 = thread(printHelloWorld);
    t1.join();
    return 0;
}

编译g++ test.cpp -std=c++11 -lpthread - o test
在这里插入图片描述

joinable

如果thread对象代表了一个执行线程,那么可以joinable。
C++中有几种情况不能joinable

  • 默认构造
  • 执行过move操作
  • 执行过join或者detach
#include<iostream>
#include<thread>
using namespace std;
void printHelloWorld(){
    cout<<"Hello World!"<<endl;
}
int main(){
    thread t1;
    if(!t1.joinable()){
        cout<<"Thread is not joinable! (default constructor)"<<endl;
    }
    t1 = thread(printHelloWorld);
    if(t1.joinable()){
        cout<<"Thread is joinable! (represents a thread of execution)"<<endl;
        t1.join();
        if(!t1.joinable()){
            cout<<"Thread is not joinable! (after call join())"<<endl;
        }
    }
    thread t3;
    thread t2(printHelloWorld);
    t3 = move(t2);
    if(!t2.joinable()){
        cout<<"Thread is not joinable! (after move)"<<endl;
    }
    t3.join();
    return 0;
}

Thread is not joinable! (default constructor)
Thread is joinable! (represents a thread of execution)
Hello World!
Thread is not joinable! (after call join())
Thread is not joinable! (after move)
Hello World!

join

线程执行完毕后函数返回,join函数可以用来阻塞调用此函数的线程,调用这个函数之后,线程对象将变成非joinable并且可以被安全销毁。

#include<iostream>
#include<thread>
#include<unistd.h>
using namespace std;
void pauseThread(int n){
    sleep(n);
    std::cout<<"pause of "<<n<<" seconds ended"<<std::endl;
}
int main(){
    cout<<"spawing 3 threads..."<<endl;
    std::thread t1(pauseThread,1);
    std::thread t2(pauseThread,2);
    std::thread t3(pauseThread,3);
    cout<<"Done spawning threads. Now wait for them to join: "<<endl;
    t1.join();
    t2.join();
    t3.join();
    cout<<"All threads joined!"<<endl;
    return 0;
}

在这里插入图片描述

detach

这个函数会将执行线程与调用线程分离,允许它们彼此独立运行,任意一个线程结束之后会释放拥有的资源。调用之后,线程对象会变成非joinable并且可以安全销毁。

#include<iostream>
#include<thread>
#include<unistd.h>
using namespace std;
void pauseThread(int n){
    this_thread::sleep_for(chrono::seconds(n));
    std::cout<<"pause of "<<n<<" seconds ended"<<std::endl;
}
int main(){
    cout<<"spawing 3 threads..."<<endl;
    std::thread (pauseThread,1).detach();
    std::thread (pauseThread,2).detach();
    std::thread (pauseThread,3).detach();
    cout<<"Done spawning threads. (the main thread will now pause for 5 seconds)"<<endl;
    pauseThread(5);
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HP-800G4-DM 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板HP 800G4 DM 35W 处理器intel i5-9600T已驱动 内存Samsung DDR4 2666 32G*2已驱动 硬盘WD SN750 500G已驱动 显卡intel UHD 630已驱动 声卡瑞昱…

SpringBoot项目中Controller层、Service层、Dao层、entity层、Configuration层、Utils层作用

SpringBoot项目中各层的作用 1、Controller层2、Service层3、Dao层&#xff08;Mapper层&#xff09;4、entity层&#xff08;model层&#xff09;5、Configuration层6、Utils层各层作用架构图 1、Controller层 Controller层为控制层&#xff0c;一般使用 RestController 或 C…

【Linux入门】Linux指令(2)

【Linux入门】Linux指令(2) 目录 【Linux入门】Linux指令(2)时间相关的指令cal指令find指令&#xff08;重要&#xff0c;选项很多&#xff09;-namegrep指令zip/unzip指令tar指令&#xff08;重要&#xff09;bc指令uname -r指令重要的几个热键[Tab],[ctrl]-c, [ctrl]-d关机&a…

车载软件架构——闲聊几句AUTOSAR OS(一)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是,他们想…

transformers两个入门示例

根据《attention is all you need》论文而形成的transformers框架在chat-gpt应用中大放异彩&#xff0c;目前transformers框架已经成了炙手可热的框架。它不仅在nlp方面很作用很大&#xff0c;根据官网的介绍&#xff0c;它还可以做很多事情&#xff0c;比如图片分类&#xff0…

【SpringCloud】二、服务注册与发现 Eureka与Nacos

文章目录 一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现 二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略 三、Nacos三、网关gateway1、网关的作用2、搭建网关服务 一、Eureka 1、服务提供者与消费者…

多源传感器GNSS INS 视觉 LiDAR 组合导航与SLAM开源项目总结

多源传感器GNSS INS 视觉 LiDAR 组合导航与SLAM开源项目总结 本文基于 吴桐wutong 微信公众号文章完善而来。 开源代码总览 名称传感器类型组合类型滤波方法备注RTKLIBG-KFGAMP、rtklibexplorerhttps://www.rtklib.com/GPSTKG-KFhttps://github.com/SGL-UT/GPSTkBNCG-KFppp_…

[MRCTF2020]Ez_bypass1

一打开就是一坨看起来像乱码的东西 查看源码才看的舒服点&#xff0c;原来是一串PHP代码 这么长一段&#xff0c;翻译起来还有点麻烦 首先第一个if语句 检测GET传参gg和id是否存在 如果不存在就输出’Please input first‘&#xff08;请先输入&#xff09;并利用die函数退出脚…

java boot项目基础配置之banner与日志配置演示 并教会你如何使用文档查看配置

上文 我们简单讲了一下 springboot 项目的配置 都是写在resources下的application.properties中 springboot 项目中 配置都写在这一个文件 可以说非常方便 不像之前 写个项目配置这里一个哪里一个 看到是非常费力 我们启动项目 这里有个图案 其实 这叫 banner 我们就用配置来…

从零开始:Java中如何定义和访问静态字段和方法

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f377; 一、静态字段 &#x1f378; 二、静态常量 &#x1f379; 三、静态方法 &#x1f37a; 四、工厂方法 &#x1f964; 五、…

使用Vue完成一个户籍管理系统

js <template> <div> <h2>学籍管理系统</h2> <div> 姓名&#xff1a; <input v-model"user.name" /> </div> <div> 年龄&#xff1a; <input v-model"user.age" /> </div> <div> 性别…

python + windQuant:挑选公司

给定一些k线选股指标&#xff0c;如何挑选符合条件的公司&#xff0c;以python windquant为例&#xff1f; 【申明&#xff1a;本例只用来作为python学习交流之用&#xff0c;切勿以此作为投资的选股条件】 0、用以下条件挑选公司&#xff1a; 仅作示例用&#xff1a; 【1】…

黑马QtDay1学习笔记

文章目录 黑马QtDay1学习笔记1 Qt简介2 Qt项目创建2.1 项目名称 不能有空格和中文2.2 项目路径不能有中文路径2.3 创建窗口三大基类2.4 Main函数中2.5 .pro文件 3 QPushButton按钮4 Qt中的对象树5 Qt中的坐标系6 Qt中信号和槽基本使用7 自定义信号和槽7.1 自定义信号 写在 sign…

【C++】——模板(泛型编程+函数模板+类模板)

文章目录 1. 前言2. 泛型编程3. 函数模板3.1 函数模板的原理3.2 函数模板的实例化3.3 模板参数的匹配原则 4. 类模板4.1 类模板的实例化 5. 结尾 1. 前言 之前我们学习了函数重载&#xff0c;让我们在写相似函数的时候非常方便&#xff0c;但函数重载还有很多不足的地方&#…

车载基础软件——嵌入式系统时间特性分析

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑&#xff1a;你的价值、你的能力、你的潜力。他…

AI人工智能逻辑回归的原理、优缺点、应用场景和实现方法

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常见的机器学习算法&#xff0c;它被广泛应用于分类问题。在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;逻辑回归是一种简单而有效的算法&#xff0c;可以用于许…

GC 三色标记算法(Go Java版本)

一、前言 GC全称Garbage Collection&#xff0c;目前主流的垃圾回收算法有两类&#xff0c;分别是追踪式垃圾回收算法&#xff08;Tracing garbage collection&#xff09;和引用计数法&#xff08; Reference counting &#xff09;。 而三色标记法是属于追踪式垃圾回收算法…

github copilot chat申请,安装,及常见问题解决

申请 首先申请&#xff0c;并开通copilot, 地址为&#xff1a;https://github.com/features/copilot&#xff0c;copilot 一个月10美金&#xff0c;第一个月免费&#xff0c;支持国内的信用卡。 开通copilot之后&#xff0c;可以申请 copilot chat 的预览版功能&#xff0c;网…

5-高级SQL查询

PS&#xff1a;插入查询结果 把一张表查询出的结果&#xff0c;插入到另一张表中。要求两张表的列数和列类型要匹配。 前面讲的所有select规则在此处都适用~ 1.聚合查询 聚合查询&#xff1a;行和行之间进行运算。带表达式查询&#xff1a;列和列之间进行运算。 常⻅的聚合函…

MySQL——聚合函数

我们上一篇讲到了 SQL 单行函数。实际上 SQL 函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。接下来我们来看看什么是聚合函数及聚合函数的分类 1. 聚合函数介绍 1.1 什么是聚合函数? 聚合函数作用于…