17

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

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

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

4

3 回答 3

15

您可以在以下章节找到该列表:http 2.9.1 Thread-Safety: //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() 等可能同时更新的内存。

于 2013-11-14T10:07:04.787 回答
5

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

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

于 2013-11-14T10:03:19.897 回答
2

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

例如,参见man strtok

概要#包括

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

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

( _rfor "reentrant") 是线程安全的变体。

不幸的是,手册页并没有说明函数线程安全的,而只是在出现问题时才提到线程安全。

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

于 2013-11-14T10:16:24.743 回答