首页 > 解决方案 > __thread 缓冲区有大小限制吗?

问题描述

我想在线程级别使用缓冲区。但我认为每个函数中的 malloc/free 都很无聊。他们可以共享缓冲区。

static __thread char my_buff[BUF_SIZE] = {0};

但是这个缓冲区有大小限制吗?如果有,如何检查?

标签: cthread-local-storage

解决方案


thread_local对象是在创建线程时动态分配的(或者在使用对象之前的任何速率,由“as-if”子句提供)。C 标准中没有指定如何完成分配,但在许多系统上使用标准库的动态分配函数。因此,只要动态分配的内存可用,就可能没有限制。(该标准也没有说明何时将此存储返回给分配给它的任何存储管理器;当然可以想象一个实现,它在应用程序终止之前不返回线程本地段,而是更喜欢从终止的线程中回收段到新创建的。但我认为这并不常见。)

请注意,至少在静态链接的可执行文件中,为每个线程分配线程本地对象,无论线程是否使用该对象。动态加载的模块还可以包括线程本地对象,因此线程所需的线程本地存储量可以随着模块的加载和卸载而改变。此功能的实现需要额外级别的间接访问线程本地存储,并且通常还涉及 TLS 段(而不是单个对象)的延迟分配。

我真的只有 ELF 系统的经验;我在通常的地方进行了一些搜索,以验证它thread_local在现代 Windows 上的工作方式大致相同。旧平台可能没有该功能,因此您可能会通过使用它来限制可移植性。我通常不会让这阻止我,但检查你打算支持的平台的平台文档似乎是谨慎的。


推荐阅读