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

not*_*ser 15 c multithreading glibc thread-safety

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

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

理想情况下,我想看到类似的名单在底部页面中ARM编译器的文档.

nos*_*nos 13

您可以在以下章节找到该列表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 - 即使posix不要求它,linux/glibc上的函数也可能是线程安全的 - 虽然这很少被记录.对于其他函数/库而不是posix所涵盖的内容,您将留下作者所记录的内容......

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


Som*_*ude 5

这取决于功能,以及您如何使用它。

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

  • @temple 在调用之间不保存任何状态的函数是线程安全的。为什么例如`memcpy` 会在调用之间保存任何状态?根本没有理由这样做。随机数生成,某些字符串函数,是的,它们需要在调用之间保存状态,这就是为什么您有两个可重入的这些函数变体(名称后附加了“_r”)。 (2认同)