__thread缓冲区有大小限制吗?

时间:2020-07-22 03:15:12

标签: c thread-local-storage

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

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

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

1 个答案:

答案 0 :(得分:1)

thread_local对象是在创建线程时动态分配的(或在使用该对象之前以任何方式使用,前提是“ as-if”子句提供)。 C标准中没有任何内容指定如何完成分配,但是在许多系统上,都使用了标准库的动态分配功能。因此,只要动态分配的内存可用,就可能没有限制。 (该标准也没有说明何时将该存储返回给分配给它的存储管理器;当然可以想象实现在应用程序终止之前不会返回线程本地段的实现,而是希望将段从终止的线程回收到新创建的。但是我不认为这很普遍。

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

我真的只有ELF系统的经验。我在通常的位置进行了一些搜索,以验证thread_local在现代Windows上应能以大致相同的方式工作。传统平台可能没有该功能,因此您可能会通过使用它来限制可移植性。通常,我不会阻止我这样做,但是检查平台文档中要支持的平台似乎确实是明智的。

相关问题