繁体   English   中英

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

[英]Are functions in the C standard library thread safe?

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

顺便说一句,对于“线程安全”,我的意思是,只要同时复制字节的日期字节是安全的,同时使用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 - 即使posix不要求它,linux / glibc上的函数也可能是线程安全的 - 虽然这很少被记录。 对于其他函数/库而不是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 (对于“reentrant”)是线程安全的变体。

遗憾的是,手册页没有养成说明函数线程安全的习惯,但只是在问题时才提到线程安全性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM