c - __thread 缓冲区有大小限制吗?
问题描述
我想在线程级别使用缓冲区。但我认为每个函数中的 malloc/free 都很无聊。他们可以共享缓冲区。
static __thread char my_buff[BUF_SIZE] = {0};
但是这个缓冲区有大小限制吗?如果有,如何检查?
解决方案
thread_local
对象是在创建线程时动态分配的(或者在使用对象之前的任何速率,由“as-if”子句提供)。C 标准中没有指定如何完成分配,但在许多系统上使用标准库的动态分配函数。因此,只要动态分配的内存可用,就可能没有限制。(该标准也没有说明何时将此存储返回给分配给它的任何存储管理器;当然可以想象一个实现,它在应用程序终止之前不返回线程本地段,而是更喜欢从终止的线程中回收段到新创建的。但我认为这并不常见。)
请注意,至少在静态链接的可执行文件中,为每个线程分配线程本地对象,无论线程是否使用该对象。动态加载的模块还可以包括线程本地对象,因此线程所需的线程本地存储量可以随着模块的加载和卸载而改变。此功能的实现需要额外级别的间接访问线程本地存储,并且通常还涉及 TLS 段(而不是单个对象)的延迟分配。
我真的只有 ELF 系统的经验;我在通常的地方进行了一些搜索,以验证它thread_local
在现代 Windows 上的工作方式大致相同。旧平台可能没有该功能,因此您可能会通过使用它来限制可移植性。我通常不会让这阻止我,但检查你打算支持的平台的平台文档似乎是谨慎的。
推荐阅读
- node.js - nodejs:Socket io客户端错误:自签名证书
- go - 我可以在共享结构中允许任意字段吗?
- c - SocketCAN长延时收包
- python - 将 S3 存储桶中的 gzip 文件提取到另一个 S3 存储桶
- sql-server - SQL Server 2017 中的情况
- c++ - 脆弱的基类问题会出现在 C++ 中吗?
- intellij-idea - intellij idea 结帐错误:doenst 显示“svn 结帐选项”对话框?
- kotlin - Kotlin 的 fold 是什么让我可以将操作函数放在右括号之后?
- google-cloud-platform - 谷歌云实例显示 SSH 而不是 RDP(Windows 而不是 Linux)
- javascript - 更新到 Codeigniter 3.x 后,为什么在 ajax 调用期间出现 json 解析错误?