【问题标题】:Is there any possibility of Memory corruption or segment fault?是否有内存损坏或段错误的可能性?
【发布时间】:2013-06-20 23:30:03
【问题描述】:

假设我有以下 C 函数

void *AllocateMemory(int numBytes)
{

     //allocate "numBytes" of memory

     //return the memory address
}

如果上面的函数被这么多进程访问,比如100个并行,是否有内存损坏或段错误的可能性?

注意:环境是多线程的。

【问题讨论】:

  • 这在很大程度上取决于该功能的实现。如果它使用适当的锁定,那么一切都很好。 malloc(3) 为每次调用锁定它的结构。
  • 没有锁定..只是一个简单的分配
  • 分配是怎么做的?我不能告诉你你的函数是否是没有源代码的线程安全的。
  • 发布函数的完整定义。没有它发表评论只会是推测性的。
  • 当它是一个进程中的多个线程时,所涉及的机制是你的 C 库实现的机制,所以要小心它不是一个广泛使用的机制。当它是多个进程时,所涉及的机制是操作系统内核的机制,因此如果您在主流操作系统或 linux 发行版上运行,几乎没有风险。

标签: c memory memory-management segmentation-fault memory-corruption


【解决方案1】:

不要混淆进程和线程。

有了流程,什么都不会发生。

使用线程,如果您的函数工作简单且不涉及或使用任何共享资源,那么它应该也能正常工作。

【讨论】:

  • Ty 用于响应。是的,分配是直截了当的。即 void *allocateMem() { //allocate Mem //No Locking-Shocking uis there in between //retuen Mem } 仍然我很困惑如何保证不会有 cprruption ???
  • 只是如何你是在分配内存吗?通过调用 malloc()?
  • OKAI 可以这样说: void *AllocateMem(int numBytes) { return (malloc(numBytes));如果这个函数被 100 或 1000 个渴望内存的进程访问,会发生什么?是否存在内存损坏或段错误的可能性?
  • 如果您使用的是“足够主流”的操作系统,则没有这种可能性。只要确保分配失败时进程不会尝试使用空指针。
  • 在我的环境中,malloc cos 没有问题。内存充足,所以每次 malloc 调用都会成功...只是好奇这种并行执行代码是否会导致内存损坏?? ??因为我必须将此代码转移到产品的生产质量代码
【解决方案2】:

所有进程都有自己的地址空间,因此多个进程不是问题。

对于线程,答案是它取决于您的malloc() 实现。

我遇到的最常见的实现是线程安全的。有关更多信息,请参阅此问题

Is malloc thread-safe?

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多