1.C++新标准
C++新标准是指C++编程语言的一系列更新和改进,这些标准为开发者提供了更多的工具和特性,使得C++成为一门更加现代化、高效且灵活的编程语言。以下是C++新标准的主要内容和特点,按照发布年份进行概述:
-
C++11
(发布于2011年):
-
是C++98之后最具里程碑意义的版本。
-
引入了许多现代C++的特性,如智能指针、多线程、并发编程、constexpr函数、lambda表达式、自动类型推导等。
-
扩充了C++核心语言的功能,如右值引用和move语义、外部模板、初始化列表等。
-
增强了C++标准程序库,包括线程支持、正则表达式、通用智能指针等。
-
-
C++14
(发布于2014年):
-
是对C++11的小改进,主要集中在语言本身的修补和优化。
-
放宽了constexpr函数的限制,增强了decltype关键字,并支持了lambda表达式的泛型编程。
-
-
C++17
(发布于2017年):
-
在C++14的基础上进一步发展,引入了更多新特性。
-
包括结构化绑定、if constexpr、折叠表达式、内联变量等。
-
这些特性使C++的语法更加简洁、直观,提高了代码的可读性和可维护性。
-
-
C++20
(发布于2020年):
-
是对C++17的延续和扩展。
-
引入了概念(concepts)、协程(coroutines)、模块化(module)、三向比较运算符等新特性。
-
这些特性提高了C++的表达能力和灵活性,使其更加适合现代软件开发的需要。
-
-
C++23及以后:
-
C++标准遵循3年开发周期,并以发布年份命名。
-
最近的C++23标准已完成更新并进入最终投票阶段,引入了模板参数捕获、可变参数模板等特性。
-
预计中的C++26将在并发和并行性方面有重大改进,但目前尚未透露具体细节。
-
总之,C++新标准通过不断引入新特性和优化现有功能,使C++保持与现代编程趋势的同步,为开发者提供了更多工具和选择,以构建更高效、更安全、更易于维护的代码。
2.thread_local 线程本地化
线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在线程开始时分配,线程结束时回收,每个线程有该对象自己的实例**。
全局变量或静态变量会被放到".data"或".bss"段中,但当使用__declspec(thread)定义一个线程私有变量的时候,编译器会把这些变量放到PE文件的".tls"段中。
对于一个TLS变量来说,它有可能是一个C++的全局对象,那么每个线程在启动时不仅仅是复制".tls"的内容那么简单,还需要把这些TLS对象初始化,必须逐个地调用它们的全局构造函数,而且当线程退出时,还要逐个地将它们析构,正如普通的全局对象在进程启动和退出时都要构造、析构一样。
C++11引入了thread_local关键字用于下述情形:(1).命名空间(全局)变量;(2).文件静态变量;(3).函数静态变量;(4).静态成员变量。此外,不同编译器提供了各自的方法声明线程局部变量。thread_local作为类成员变量时必须是static的。
#include <iostream>
#include <thread>
thread_local int thread_value = 0;
void thread_function(int id){
thread_value = id;
std::cout<<"thread"<<id<<"thread_value ="<<thread_value<<std::endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::thread t1(thread_function,1);
std::thread t2(thread_function,2);
t1.join();
t2.join();
std::cout<<"main"<<thread_value<<std::endl;
return 0;
}
输出结果 threadthread2thread_value =2 1thread_value =1 main0
这表明每个线程都有自己独立的thread_specific_value副本,它们之间互不干扰。
thread_local 特点
-
每个线程都有自己的变量副本,互不干扰。
-
线程局部存储的变量在不同线程间是独立的,但在同一线程内是共享的。
-
thread_local变量的生命周期与线程的生命周期相同,即在线程创建时分配,在线程销毁时释放。 -
可以用于解决多线程环境下的线程隔离问题,如线程特定配置或状态信息的存储。
future
在C++中,std::future 是C++11标准引入的一个模板类,它用于表示异步操作的结果。它提供了一种机制,使得一个线程可以等待另一个线程的结果,而无需阻塞当前线程的执行。
std::future 通常与 std::async、std::promise 或 std::packaged_task 一起使用。std::async 用于在单独的线程中启动一个异步任务,并返回一个 std::future 对象,该对象将保存异步操作的结果。std::promise 和 std::packaged_task 则允许你在一个线程中设置结果,并在另一个线程中通过 std::fut

&spm=1001.2101.3001.5002&articleId=139493288&d=1&t=3&u=13cd307fdfac4f0fbfd0e4a2418eb80b)
2606

被折叠的 条评论
为什么被折叠?



