C语言thread_local关键字

news/2024/12/25 14:36:56/文章来源:https://www.cnblogs.com/tryst/p/18630353

GNU C语言的"__thread"与C11关键字_Thread_local等效,这里只说一下C11的。

#define thread_local _Thread_local  //(since C11, then removed in C23)

Since C23, thread_local is itself a keyword, which may also be a predefined macro, so <threads.h> no longer provides it.

需要说明的是,c11引入的_Thread_local关键字在c23标准中可以直接使用thread_local ,也即c23标准_Thread_local关键字被废弃了。

有且只有 thread_local 关键字修饰的变量具有线程(thread)周期,这些变量在线程开始的时候被生成,在线程结束的时候被销毁,并且每一个线程都拥有一个独立的变量实例。

thread_local 一般用于需要保证线程安全的函数中。

以下部分在一些编译器中还没有实现。

在标准的 C 语言规范中,对线程的支持迟迟没有出现,终于在 C11 中实现了。在此之前,POSIX 线程 API 被用作利用多线程编程的主要工具。由于 C11 提供了更标准的接口,可以在不依赖平台的情况下使用,因此建议使用 ISO 语言 API,而不要使用 POSIX 版本。尽管这两个 API 的功能原型不匹配,但主要功能大多相似。在下面的示例中,我们演示了一个简单的场景,其中启动了四个线程来执行 printHello 函数,然后在不加入主线程的情况下终止该线程。

thrd_create 接受三个参数,

  1. 第一个是指向线程标识符的指针。
  2. 第二个参数的类型为 thrd_start_t,对于函数指针原型而言,其名称仅为 typedef
  3. 第三个参数指定可以传递给函数的参数。

使用枚举值定义 thrd_create 的返回状态代码:thrd_successthrd_nomem 和 thrd_error

thrd_join 是 pthread_join 函数的一个类比,它将阻塞当前线程,直到给定线程完成执行。它带有两个参数:线程标识符和 int 指针,表示如果用户提供有效地址,则可以选择存储返回状态代码的位置。如果在已经分离或联接的线程上调用 thrd_join,则结果是未定义的行为。该函数返回对应于 thrd_success 或 thrd_error 的值。

下一个示例代码实现了四个线程递增 atomic_int 类型变量的情况。最后,等待其他线程完成的主线程将打印 counter 的最终总和值。

#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
#include <unistd.h>#ifndef NUM_THREADS
#define NUM_THREADS 4
#endifatomic_int counter = 0;enum { MAX_ITER = 1000 };void *printHello(void *thr_id) {long tid;tid = (long)thr_id;printf("thread %ld started incrementing ID - %lu\n", tid, thrd_current());for (int i = 0; i < MAX_ITER; ++i) {counter += 1;}return NULL;
}int main(int argc, char const *argv[]) {thrd_t threads[NUM_THREADS];int rc;long t;for (t = 0; t < NUM_THREADS; t++) {rc = thrd_create(&threads[t], (thrd_start_t)printHello, (void *)t);if (rc == thrd_error) {printf("ERORR; thrd_create() call failed\n");exit(EXIT_FAILURE);}}for (t = 0; t < NUM_THREADS; t++) {thrd_join(threads[t], NULL);}printf("count = %d\n", counter);thrd_exit(EXIT_SUCCESS);
}

输出

 

 

参考资料:

1. thread_local

2. C11 GCC threads.h not found

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码编译geoserver(idea)

官方教程:https://docs.geoserver.org/main/en/developer/quickstart/intellij.html从 git 存储库中检出源代码:git clone https://github.com/geoserver/geoserver.git geoserver列出可用的分支:% git branch2.21.x2.22.x* main选择main最新动态:% git checkout main或者为…

MFC中CBitmap、CBrush、CFont、CPalette、CPen、CRgn删除GDI对象问题

CBitmap、CBrush、CFont、CPalette、CPen、CRgn均继承自CGdiObject,CDI对象属于CGdiObject,在该类的析构函数中会释放,因此CBitmap、CBrush、CFont、CPalette、CPen、CRgn不必要显式调用DeleteObject()。如果GDI对象在在堆上分配的,则在特定时刻需要删除它,以便执行其析构…

【甲方安全】政府行业+80个威胁检测与安全事件分析场景(2025)

本篇幅详细梳理了 80 个在政企网络安全分析中常见的应用场景,这些场景涵盖了从攻击前兆(如漏洞扫描、情报收集)、攻击过程(如漏洞利用、横向移动)到攻击结果(如数据加密、信息泄露)的各个阶段,旨在协助 SOC 分析师们更好地构建主动防御体系。这些场景并非抽象概念,而是…

想自己做大模型备案的企业看过来【评估测试题+备案源文件】

大模型备案,大模型语料标注规则,大模型安全评估报告文章目录 (一)适用主体 (二)语料安全 (三)模型安全 (四)安全措施要求 (五)词库要求 (六)安全评估要求 (七)附录大模型备案材料源文件 2024年3月1日,我国通过了《生成式人工智能服务安全基本要求》(以下简称…

树洞09

情绪很不好,没人能依靠 钱财多有价,感情胜千金 金玉良缘广,木石前盟稀 愿君有真爱,伴君度此生。

qt读写ini文件

[group1]key1=val1key2=val2sameKay=sameVal [group2]jian1=zhi1jian2=zhi2sameKay=sameZhi比如创建插入一组ini文件,下面是文件写入的代码; Ini文件的写入 ini文件不需要像xml和json一样需要使用QFile打开文件,只需将文件路径及文件格式传入即可(下方代码运行完毕,ini文件…

【科普系列】LIN协议错误类型介绍

引言LIN(Local Interconnect Network)是一种针对汽车电子系统应用的串行通信协议,主要用于汽车电子控制单元(ECU)之间的通信。LIN总线的特点是成本低、速率低、通信距离短、连接节点少,主要用于对带块要求低、实时性要求不高的控制任务,例如车门控制、天窗控制、座椅控制…

详述大模型备案

大模型备案,大模型语料标注规则,大模型安全评估报告,大模型网信办备案大模型备案安全评估流程详细说明,见下图:大模型安全评估流程图 算法备案安全评估流程详细说明,见下图:算法安全评估流程图**大模型备案,大模型算法备案 ** 一、大模型算法备案的强制性 二、生成式人…

精选!J 人电商零售圣诞季,哪 6 款办公软件能激发团队工作学习潜能?

岁末的圣诞节,电商零售行业迎来了最为繁忙的购物狂欢季。在这关键时期,J 人电商团队凭借其果断、有计划、注重秩序的特质,渴望通过高效的团队协作和个人的快速学习成长,在激烈的市场竞争中脱颖而出。而选择合适的办公软件,无疑是实现这一目标的重要利器。接下来,将为您详…

智能网联汽车网络安全测试解决方案

经纬恒润的整车安全团队可协助客户制定系统的网络安全测试解决方案,具体包括:网络安全需求实现测试、网络安全合规性测试和渗透测试。经纬恒润可提供涵盖软件阶段、系统阶段和整车阶段的网络安全测试服务和相关测试工具,以实现网络安全策略的快速验证。概述为了应对日益严峻…

【工作相关】AOSP GSI image下载

android14 gsi下载地址: https://ci.android.com/builds/branches/aosp-android14-gsi/grid?legacy=1android13 gsi下载地址: https://ci.android.com/builds/branches/aosp-android13-gsi/grid?legacy=1