我有一些使用memmove()
在缓冲区中移动字节的代码。缓冲区由多个线程访问。我得到一个非常奇怪的行为;有时缓冲区不应该是它应该是什么,我在想如果memmove()
或/和malloc()
是线程安全的。我正在使用iOS(如果这是依赖于平台的)。
答案 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库没有线程概念,所以它定义的函数不能。