【问题标题】:Segmentation fault while allocating memory with multiple threads使用多个线程分配内存时出现分段错误
【发布时间】:2012-04-21 18:44:21
【问题描述】:

我想更清楚地了解 C 中的 malloc() 调用的概念。我有一个多线程应用程序,其中主线程生成任意数量的工作线程 (pthread)。然后每个工作线程运行一个无限函数(包含的函数来自另一个.c 文件并实现了一段时间(1)),由它负责持续的网络I/O。

对于每个线程,我都需要一个哈希表,所以我使用了 glib 提供的哈希映射。我所做的是我在每个线程的函数中初始化了一个哈希映射,它在后端为结构分配一些初始内存,然后它可以随着需要的增加而增长。

现在,当我运行应用程序时,它会抛出错误,包括分段错误和无法为结构分配任何内存。我花了一段时间才发现错误是由于无法为哈希映射分配内存。我的想法是(仍然认为)每个线程都有自己的内存空间,它会在自己的内存块内为其各自的哈希映射分配一块内存。我能够通过在初始化哈希映射之前和之后使用mutex 锁来修复错误,例如(sudo 代码):

lock mutex
initialize hashmap
unlock mutex

在每个线程中调用的哈希映射的初始化代码是:

 GHashTable *g_hash_table;
  g_hash_table = g_hash_table_new (g_int_hash, g_int_equal);

虽然它解决了问题,但在此之后我有点困惑。为什么在不使用锁定的情况下会出现此问题,因为每个线程都有自己的内存空间用于其实现的功能,并且在分配自己的内存时不应与其他线程冲突。 非常感谢所有指导。

谢谢。

【问题讨论】:

    标签: c multithreading pthreads malloc glib


    【解决方案1】:

    每个线程不会有自己的内存空间——所有线程都可以访问进程内所有线程的内存。

    也就是说,每个线程都在该空间内分配了自己的堆栈,因此如果不误用 auto-vars 是可以的,并且 malloc/free 应该是线程安全的,因此是动态分配的哈希映射,(由线程堆栈上的自动指针),应该没问题。

    如果有选择,请确保您链接的是库的线程安全版本。

    互斥锁应该不是必需的。如果它正在解决问题,那么你是对的 - 有些东西,malloc/free,可能不是线程安全的。

    您确定 hashmap 代码只引用 auto 或 malloced 存储吗?没有全局变量/静态变量进入?

    【讨论】:

    • 是的,线程自己的内存是指它自己的堆栈,任何在线程内初始化的结构都应该在各自的堆栈上分配内存。 Glib 是线程安全的绝对是一件有趣的事情。我不确定。希望得到一些帮助来清除我的概念:)
    • 问题中添加了hash map的初始化代码。
    • 没关系,但是它调用了 'g_hash_table_new' 工厂函数,我们不知道里面发生了什么。
    • 似乎有一个“g_thread_init()”调用作为对 Glib 的第一次调用。此后,Glib 是线程安全的。
    • 是的,感谢您的帮助 :) 赞赏 :)
    猜你喜欢
    • 2014-12-12
    • 2015-12-26
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2014-07-17
    • 2013-10-07
    • 2016-10-23
    • 2016-11-28
    相关资源
    最近更新 更多