2012-04-21 166 views
1

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

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

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

lock mutex 
initialize hashmap 
unlock mutex 

初始化一个哈希表,被称作每个线程的代码是:

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

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

谢谢。

回答

2

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

这就是说,每个线程都在这个空间内分配了自己的堆栈,所以auto-vars是没问题的,而且malloc/free应该是线程安全的,所以动态分配的哈希映射线程堆栈上的自动指针)应该没问题。

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

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

你肯定HashMap的代码只引用自动或malloced存储?没有全局/静态信息进入?

+0

是啊,一个线程自己的记忆我的意思是它自己的堆栈,这是一个线程中初始化任何结构应相应栈上分配的内存。 Glib是线程安全的,绝对是一件有趣的事情。我不确定这一点。希望有一些帮助来清除我的概念:) – Abdullah 2012-04-21 18:57:24

+0

添加散列映射的初始化代码到问题。 – Abdullah 2012-04-21 19:02:28

+0

没关系,但它调用了'g_hash_table_new'工厂函数,我们不知道那里发生了什么。 – 2012-04-21 19:11:46