c - 使用多个线程分配内存时出现段错误

标签 c multithreading pthreads malloc glib

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

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

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

lock mutex
initialize hashmap
unlock mutex

在每个线程中调用的初始化 HashMap 的代码是:

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

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

谢谢。

最佳答案

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

就是说,每个线程都在这个空间内分配了自己的堆栈,所以如果不被滥用,auto-vars 是可以的,malloc/free 应该是线程安全的,所以一个动态分配的 HashMap ,(由一个指向线程堆栈上的自动指针),应该没问题。

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

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

您确定 hashmap 代码仅引用自动或 malloced 存储?没有全局变量/静态变量悄悄进入?

关于c - 使用多个线程分配内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10261890/

相关文章:

c - ZooKeeper C 绑定(bind)安装

c - 是否需要 %c fprintf 说明符来获取 int 参数

c - 如何确定 Linux 上哪些 CPU 在线

linux - 如何在使用 QEMU 的主机操作系统上运行的 guest 操作系统与其主机操作系统之间传输信号

c - 从主结构中提取子结构以创建线程

c - 如何等待 pthread 条件变量或信号?

c - 为什么这些构造使用增量前和增量后未定义的行为?

c# - 用c#异步处理Bitmap对象

c++ - C++中多线程快速排序期间的段错误

c - Glib 线程与 GMain 循环事件