分配具有多个线程的内存时出现分段错误

时间:2012-04-21 18:44:21

标签: c multithreading pthreads malloc glib

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

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

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

lock mutex
initialize hashmap
unlock mutex

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

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

相关问题