C 标准库线程中的函数是否安全



我在哪里可以获得明确的答案,我的memcpy(使用 Ubuntu 附带的 eglibc 实现)是否线程安全? - 老实说,我真的没有在文档中找到明确的是或否。

顺便说一下,对于"线程安全",我的意思是只要可以安全地同时复制字节的日期字节,就可以安全地同时使用memcpy。至少在将只读数据复制到不重叠的区域时,这应该是可能的。

理想情况下,我希望在 ARM 编译器文档中看到类似于本页底部的列表。

您可以在第 2.9.1 Thread-Safety 章找到该列表: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01

也就是说,这是 posix 不需要线程安全的函数的列表。所有其他函数都必须是线程安全的。Posix包括标准的C库和典型的"unix"接口。(完整列表在这里,http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html)

memcpy() 由 posix 指定,但在 2.9.1 中不是列表的一部分,因此可以认为是线程安全的。

linux 上的各种环境至少尝试尽其所能实现 posix - linux/glibc 上的函数可能是线程安全的,即使 posix 不需要它 - 尽管这很少被记录下来。对于 posix 涵盖的其他函数/库,您只剩下它们的作者记录的内容......

据我所知,posix 将线程安全等同于重入,并保证没有内部数据争用。但是,您负责可能的外部数据争用 - 例如保护自己免受调用,例如memcpy()与可能同时更新的内存。

这取决于函数以及您如何使用它。

memcpy为例,如果您复制源和目标都专用于单个线程的数据,则通常是线程安全的。如果写入的数据可以从另一个线程读取/写入,则它不再是线程安全的,您必须保护访问。

如果 glibc 函数不是线程安全的,那么手册页会这样说,并且(很可能)还会记录一个线程安全的变体。

例如,请参阅man strtok

概要 #include

   char *strtok(char *str, const char *delim);
   char *strtok_r(char *str, const char *delim, char **saveptr);

_r(用于"可重入")是线程安全变体。

遗憾的是,手册页没有声明函数线程安全的习惯,而只是在出现问题时才提到线程安全。

与所有函数一样,如果您给它一个指向共享资源的指针,那么它将变得线程不安全。由您来处理锁定。

最新更新