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

时间:2013-11-14 09:57:41

标签: c multithreading thread-safety glibc

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

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

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

3 个答案:

答案 0 :(得分:13)

您可以在2.9.1 Thread-Safetyhttp://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将thread safety等同于重入,并保证没有内部数据竞赛。但是,您应对可能的外部数据竞赛负责 - 例如保护自己免受呼叫,例如memcpy(),内存可能会同时更新。

答案 1 :(得分:4)

这取决于功能以及使用方式。

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

答案 2 :(得分:1)

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

例如,请参阅man strtok

  

概要          #include

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

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

_r(对于“reentrant”)是线程安全的变体。

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

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