【问题标题】:Are memmove and malloc thread safe?memmove 和 malloc 线程安全吗?
【发布时间】:2011-04-06 17:46:18
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我见过的每个 C 线程规范都要求 malloc 是线程安全的,当然即将到来的 C1x 标准也将如此。 memmove 在线程安全的正常定义中也是线程安全的,不包括使用它同时从多个线程修改同一个对象。
      • @R:每个?编译器供应商做了一些事情,是的,它很受欢迎,但这不是必需的。除非您选择正确的库,否则 MSVS 的 malloc 不是线程安全的。我以为我很清楚 memmove 与 assignments 是一样的。
      【解决方案4】:

      由于当前的 C 标准没有指定线程,所以关于线程安全没有什么可说的。每当您拥有线程时,您所处理的系统对标准库函数的行为方式提出了更多要求,超出了基本 C 语言标准的要求。我不确定 iOS 有什么要求,但 POSIX 和 Windows 都要求 malloc 是线程安全的,而且我很难相信 90 年代中期之后设计的任何系统都不会提出这个要求。

      请注意,即将到来的 C1x 标准将指定线程,如果实现有线程,那么 malloc 将被要求是线程安全的。

      【讨论】:

        【解决方案5】:

        不,由于标准C库没有线程的概念,它定义的函数不可能。

        【讨论】:

        • 我明白了,所以基本上没有函数在 C(标准)中是线程安全的?很高兴知道!我认为这是我的问题!
        • @mindnoise:C 标准不是线程感知的,但由于大多数当前 CRT 实现都用于多线程环境,每个特定的编译器通常都会对什么是什么和什么不是提供特定的保证标准库中的线程安全。
        • 好的,这意味着我必须找出在 Objective-C/iOS 中它们是否存在,尽管在 cmets 之后判断,我认为不是。
        • 不在某种共享静态(非堆栈)状态下运行的函数可能是安全的,例如 strtol()。
        • @Martin:当然它有状态,但我希望它在堆栈上,所以运行相同代码的两个线程将没有共同的数据。这就是我的意思,为了清楚起见,我将进行编辑。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 2010-11-12
        • 2017-12-10
        相关资源
        最近更新 更多