memmove和malloc线程安全吗?

时间:2011-04-06 17:46:18

标签: c

我有一些使用memmove()在缓冲区中移动字节的代码。缓冲区由多个线程访问。我得到一个非常奇怪的行为;有时缓冲区不应该是它应该是什么,我在想如果memmove()或/和malloc()是线程安全的。我正在使用iOS(如果这是依赖于平台的)。

5 个答案:

答案 0 :(得分:6)

在提供线程的实现中,malloc通常是线程安全的(即,即使从多个线程调用malloc,它也会采取措施确保堆不会被破坏) 。它的确切方式会有所不同:一些使用单个堆,内部同步以确保不会出现损坏。其他人将使用多个堆,因此不同的线程可以同时分配内存而不会发生冲突。

memmove通常就像您在自己的代码中进行分配一样 - 如果您在线程之间共享缓冲区,则您有责任同步对该数据的访问。

答案 1 :(得分:3)

您应该使用互斥锁(NSLock)作为访问缓冲区的保护屏障。请查看Apple Synchronization中的Threading Programming Guide

答案 2 :(得分:2)

Malloc可能是线程安全的。该标准不要求它,但许多C编译器用于其应用程序需要线程安全的系统,并且您的特定编译器库可能是线程安全的,或者提供线程安全选项。我不知道iOS。

Memmove(或任何其他类型的块移动)不是线程安全的,只不过赋值语句是线程安全的。

答案 3 :(得分:1)

由于当前的C标准没有指定线程,因此对线程安全没有任何意义。无论什么时候有线程,你都要处理一个系统,该系统除了基本的C语言标准的要求之外,还对标准库函数的行为方式提出了进一步的要求。我不确定iOS的要求是什么,但POSIX和Windows都要求malloc是线程安全的,而且我发现很难相信90年代中期之后设计的任何系统都不会满足这一要求。 / p>

请注意,即将推出的C1x标准将指定线程,如果实现具有线程,则malloc将需要线程安全。

答案 4 :(得分:0)

不,因为标准C库没有线程概念,所以它定义的函数不能。