__thread 缓冲区有大小限制吗?

Any size limit on the __thread buffer?

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

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

但是这个缓冲区有大小限制吗?如果有,怎么查看?

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

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

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