VS2022 17.8 功能更新:现已支持 C11 线程

news2024/11/23 21:45:03

早在 VS2022 17.5 版本,Microsoft Visual C 库已经初步支持了 C11 atomics。今天,我们很高兴地宣布,在最新版本 VS2022 17.8 预览版 2 中已正式支持 C11 线程。开发者可以更轻松地将跨平台 C 应用程序移植到 Windows,而无需开发线程在不同平台上的兼容性层。

和 C11 atomics 不同的是,C11 线程并不和 C++ 的

共享同一个 ABI,但是 C++ 程序可以包含 C11 线程的头文件并像调用其他 C 程序那样调用该头文件中的函数。两者都是根据 Windows 提供的原语实现的,因此它们的用法可以在同一程序和同一线程中混合使用。但是,他们的底层实现是不同的,例如,你不能将 C11 互斥体与 C++ 条件变量一起使用。

C11 包含对线程和各种相关并发原语的支持,包括互斥锁、条件变量和特定于线程的存储。所有这些都在VS2022 17.8 预览版 2 中实现。

线程

线程是使用 thrd_create 创建,只需要将线程的函数指针和用户数据指针(可能为 null)以及指向要填充的thrd_t结构的指针传递到该指针。使用 thrd_create 创建 thrd_t 后,你可以调用函数将其与其他 thrd_t 进行比较、联接或分离,还提供了用于休眠或生成当前线程的函数。

>> 请移步至 topomel.com 以查看图片 <<

我们的实现与基于 pthreads 的 C11 线程实现之间的主要区别在于,线程不能使用 thrd_current 和 thrd_detach 自行分离。这是因为线程在 Windows 和类 Unix 上的工作方式存在根本差异,我们需要一个跟踪线程句柄的共享数据结构来实现一些常用的操作。

在类 Unix 操作系统上,整数线程 ID 是线程的句柄,分离只是设置一个标志,导致线程在完成后立即被清理。这使得分离的线程在类 Unix 上使用起来有些危险,因为在分离的线程退出后,对该线程 ID 的任何其他引用都将悬而未决,并且以后可能会完全引用不同的线程。在 Windows 上,线程的句柄是 win32 句柄,并被计算引用。当最后一个句柄关闭时,将清理线程。除了跟踪它们并关闭每个句柄之外,无法关闭线程的所有句柄。

我们可以通过保留线程 ID 的共享映射来实现 Unix/pthreads 行为,并通过 thrd_create 填充。如果你需要此功能,则可以自己实现类似功能,但我们默认不提供此功能,因为即使不使用也会产生成本。还可以使用更好的解决方法,例如通过用户数据指针将指针传递给创建的线程,将指针传递到 thrd_create 填充的 thrd_t 结构体中。

互斥体

互斥体通过 mtx_t 结构和相关功能提供。互斥体可以是普通的、递归的、定时的或这些属性的组合。所有类型的互斥体都使用相同的函数进行操作(类型是动态的)。

>> 请移步至 topomel.com 以查看图片 <<

我们的互斥体始终在 Slim Reader Writer Locks 之上实现,在 x64 上每个为 32 字节(我们的 C++ std::mutex 为 80 字节)。它们由一个 8 字节标记(这比需要的要多得多,但为将来的扩展提供了一些空间)、一个 SRWLock、一个 win32 CONDITION_VARIABLE和一个 32 位所有者和锁计数组成。始终保持所有者和锁计数,即使互斥体不是递归的。
如果你尝试递归锁定非递归互斥体,或解锁不属于你的互斥体,则调用 abort 。结构上有效的 mtx_unlock 调用始终成功,在我们的实现中忽略 mtx_unlock 的返回值是安全的。

在我们的实现中,你不需要调用 mtx_init, 一个置零的 mtx_t 是有效的普通互斥体。互斥体也不需要任何清理,对mtx_destroy 的调用是可选的。这意味着你可以安全地将互斥体用作静态变量和类似变量。

条件变量

条件变量通过 cnd_t 结构和相关函数提供。此结构为 8 个字节,仅存储 win32 CONDITION_VARIABLE。
你可以使用 cnd_wait 或 cnd_timedwait 等待条件变量,也可以使用 cnd_signal 唤醒一个等待线程,也可以使用 cnd_broadcast 唤醒所有等待线程,另外,还支持虚假唤醒。

>> 请移步至 topomel.com 以查看图片 <<

与互斥体类似,清零条件变量是有效的,你可以省略对 cnd_init 和 cnd_destroy 的调用。

线程特定存储

特定于线程的存储通过 _Thread_local(C23 中的thread_local)关键字或通过 tss_ 系列函数提供。_Thread_local的工作方式与__declspec(线程)(请参阅文档)类似,tss_函数的工作方式与 Fls* 或 Tls* 系列函数类似,但不完全相同。

>> 请移步至 topomel.com 以查看图片 <<

C11 TSS 工具支持析构函数,这些析构函数在线程退出时运行,并传递关联的 TSS 键的值(如果该值为非空)。宏TSS_DTOR_ITERATIONS指定在析构函数调用tss_set的情况下,我们将检查要运行的更多析构函数的次数。目前它设置为 1,但是,如果这对你来说是个问题,请告诉我们。析构函数从 DllMain 或 TLS 回调(如果使用静态运行时)运行,并且不会在进程拆卸时运行。这是与 FLS 析构函数的重要区别,后者在进程拆卸时运行,并在任何 DllMain 例程或 TLS 回调之前运行。

TSS 限制和性能特征

使用显式 tss_ 函数时,每个进程限制为 1024 个 TSS 索引,这些索引与用于 Fls* 函数、Tls* 函数或_Thread_local“隐式”TLS 变量的索引不同。如果使用任何

函数(不仅仅是 TSS 函数)并使用静态运行时,则至少使用一个隐式 TLS 索引(用于_Thread_local的索引),即使你不使用隐式 TLS。这是因为我们需要启用 TLS 回调,这会导致加载器分配这样的索引。

如果这是一个问题(例如,由于动态加载此类模块所需的加载器体操),请告诉我们,或者只使用动态运行时。如果你使用 tss_ 函数,那么另外你将使用一个动态 TLS 索引(与 TlsAlloc 使用的索引相同),无论你创建多少个tss_ts,你都将只使用一个。如果曾经在该线程上设置了具有关联析构函数的 TSS 索引,则线程只会在线程退出时花时间处理 TSS 析构函数。创建第一个tss_t时,将分配析构函数表,首次在特定线程上使用tss_set时,将分配每个线程表。内存使用情况与使用 C11 TSS 功能的线程数(而不是进程中的线程总数)成比例。析构函数表为 8KiB(在 32 位平台上为 4KiB),每个线程表为 8209 字节(在 32 位平台上为 4105 字节)。这些性能和内存特性将来可能会发生变化。

新的运行时组件

由于 threads.h 是一项新功能,我们希望实现能够随着时间的推移而更改和改进,因此它作为 vcruntime: vcruntime140_threads.dll 和 vcruntime140_threadsd.dll 的新附属 DLL 发布。如果使用动态版本的 Visual C++ 运行时(/MD 或 /MDd),并且使用新的线程工具,则需要随应用重新分发此文件,或者重新分发足够新的 Visual C++ 运行时修订器,以包含这些文件。如果不接触 C11 线程功能,则应用将不依赖于此 DLL 中的任何内容,并且根本不会加载。

总结

如果你恰好是一个程序员,如果你又恰好是一名 C++ 程序员,那么,今天这篇文章可以作为课后扩展资料,了解下就可以了。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《C11 Threads in Visual Studio 2022 version 17.8 Preview 2》

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

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

相关文章

华为OD机试 - 最小步骤数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入&#xff1a;4 8 7 5 2 3 6 4 8 12、输出&#xff1a;23、说明&#xff1a;4、思路分析 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《…

网络安全总结

前言 本文内容主要摘抄网络规划设计师的教材和腾讯-SUMMER课堂&#xff0c;主要对网络安全进行简单梳理和总结 OSI安全体系 X轴表示8种安全机制&#xff0c;Y轴表示OSI7层模型&#xff0c;Z轴表示5种安全服务&#xff0c;图中X是水平&#xff0c;Y轴竖直&#xff0c;Z轴向外…

2023年中国喷头受益于技术创新,功能不断提升[图]

喷头行业是一个专注于生产和供应各种类型喷头的产业。喷头是一种用于将液体、气体或粉末等物质喷射或喷洒的装置&#xff0c;广泛应用于不同领域&#xff0c;包括工业、农业、家用、医疗等。 喷头行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随…

Redis 获取、设置配置文件

以Ubuntu 为例 redis配置文件 cd /etc/redis sudo vim redis.conf 获取配置文件、修改配置文件

【轻松玩转MacOS】网络连接篇

引言 本篇让我们来聊聊网络连接。不论你是在家、在办公室&#xff0c;还是咖啡厅、机场&#xff0c;几乎所有的MacOS用户都需要连接到互联网。在这个部分&#xff0c;我们将向你展示如何连接到互联网和局域网。让我们开始吧&#xff01; 一、连接到互联网 首先&#xff0c;我…

农业育种好策略:凌恩生物种质资源数字化全方位解决方案

动植物育种是通过创造遗传变异、改良遗传特性&#xff0c;以培育具有优良性状的动植物新品种的技术。随着高通量组学技术的发展和应用&#xff0c;分子育种等现代科学理论与技术得以发展和不断完善&#xff0c;是未来作物育种的不二选择&#xff0c;它的精准性、高效性都将带领…

NoSQL之 Redis命令工具及常用命令

目录 1 Redis 命令工具 1.1 redis-cli 命令行工具 1.2 redis-benchmark 测试工具 2 Redis 数据库常用命令 2.1 set&#xff1a;存放数据&#xff0c;命令格式为 set key value 2.2 get&#xff1a;获取数据&#xff0c;命令格式为 get key 2.3 keys 命令可以取符合规则的…

深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

入门级气传导耳机推荐哪款?安利几款好用的气传导耳机

​在当今的快节奏生活中&#xff0c;音乐成为了我们放松身心的重要方式。然而&#xff0c;我们在享受音乐的同时&#xff0c;也面临着耳机线缆的束缚和耳朵的压迫感。这时&#xff0c;气传导耳机应运而生&#xff0c;它们以一种更加先进、舒适的方式来传递音乐&#xff0c;为我…

【C++】-C++11中的知识点(上)--右值引用,列表初始化,声明

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

Linux基本指令一

Linux基本指令一 一、ls指令1、语法2、功能3、常用选项4、示例 二、pwd指令1、功能2、示例 三、cd指令1、语法2、功能3、常用操作4、示例 四、 touch指令1、语法2、功能3、示例 五、mkdir指令1、语法2、功能3、常用选项4、示例 六、rmdir指令1、语法2、适用对象3、功能4、常用选…

孙哥Spring源码第27集

第27集、手写实现AOP 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、手写实现AOP的缺点有哪些&#xff1f; 增加额外功能时&#xff0c;会对所有的方法 都加入对应的功能 问题 不灵活 &#xff08;事务 CUD 加入 R 不应该加入&a…

聊聊JDK19特性之虚拟线程 | 京东云技术团队

1.前言 在读《深入理解JVM虚拟机》这本书前两章的时候整理了JDK从1.0到最新版本发展史&#xff0c;其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性&#xff0c;在调研JDK19新增特性的时候了解到了虚拟线程这个概念&#xff0c;于是对虚拟线程进行学习整理内…

LLM项目代码改写

背景&#xff1a; 最近在做代码大语言模型生成项目代码的课题。代码生成现在大部分的工作是在做即时代码生成&#xff0c;这个有点类似代码智能提示&#xff0c;只不过生成的可能是一段片段代码&#xff1b;然而对于整个项目代码的生成做的团队并不多&#xff0c;原因大致如下…

Jenkin 添加节点报错No Known Hosts file was found

/var/lib/jenkins/.ssh/known_hosts [SSH] No Known Hosts file was found at /var/lib/jenkins/.ssh/known_hosts. Please ensure one is created at this path and that Jenkins can read it. /var/lib/jenkins/.ssh/known_hosts 存了是已经接受SSH key认证的目标节点&#x…

ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统

框架依赖 一、发布 框架依赖&#xff08;FDD&#xff09;&#xff1a;即Framework-dependent deployments的缩写。这种发布方式依赖于Framework框架&#xff0c;即要部署的服务器上面必须按照ASP.NET Core 运行时环境(ASP.NET Core Runtime)。这种部署方式是微软默认推荐的。下…

美妆行业在微信小程序中可以实现什么功能

随着移动互联网的发展&#xff0c;微信小程序作为一种轻量级的应用形态&#xff0c;越来越受到商家的青睐。对于美妆行业来说&#xff0c;微信小程序不仅可以提高品牌曝光率&#xff0c;提升用户体验&#xff0c;还可以通过各种功能实现销售转化。下面我们将介绍美妆行业在微信…

软件工程从理论到实践客观题汇总(头歌第一章至第八章)

一、软件工程课程概述 1、计算机软件的变化 2、实践准备-协同开发方法与平台 3、实践准备-群体化代码标注平台 4、实践准备-群体化学习平台 二、从程序到软件 1、程序及其质量 2、程序质量保证方法 3、程序质量分析方法 4、软件及其质量 5、开源软件 三、软件工程概述 1、…

通讯网关软件018——利用CommGate X2MQTT实现MQTT访问OPC Server

本文介绍利用CommGate X2MQTT实现MQTT访问OPC Server。CommGate X2MQTT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统配置OPC Server&#xff0c;现在上位机需要通过MQTT Subscr…

ORACLE中SQL运算符的优先级

SQL运算符优先级: 注&#xff1a; 1、可以使用括号改变优先级顺序 2、可以看出OR的优先级最低&#xff0c;算术运算符的优先级最高 另&#xff1a;操作符优先级 * / - 1、乘除的优先级高于加减&#xff1b; 2、同一优先级运算符从左向右执行&#xff1b; 3、括号内的…