哪个Unix没有线程安全的malloc?

时间:2013-05-12 17:05:05

标签: c multithreading

我希望我的C程序即使在非常老的Unix操作系统上也可以移植,但问题是我正在使用pthreads和动态分配(malloc)。我所知道的所有Unix都有一个线程安全的malloc(Linux,* BSD,Irix,Solaris)但是C标准并不能保证这一点,而且我确定有很老的版本,这不是真的。

那么,是否有一些平台列表需要使用互斥锁来包装malloc()调用?我打算编写一个./configure测试,检查当前平台是否在该列表中。

另一种选择是测试malloc()的线程安全性,但我知道没有确定性的方法来做到这一点。关于这个的任何想法呢?

1 个答案:

答案 0 :(得分:6)

唯一具有线程的C标准(因此可以与您的问题相关)是C11,其中声明:

  

为了确定数据竞争的存在,记忆   分配函数表现得好像只访问内存一样   可通过参数访问的位置,而不是其他静态的   持续时间存储。

或者换句话说,只要两个线程没有将相同的地址传递给reallocfree,所有对内存函数的调用都是线程安全的。

对于POSIX,这就是你现在可以找到的所有Unix':

  

除非另有明确说明,否则IEEE Std 1003.1-2001的系统接口卷中定义的每个功能都是线程安全的。

我不知道你从哪里断言malloc对于旧的Unix来说不是线程安全的,一个没有实现该线程安全的线程的系统几乎没用。在这样一个旧系统上可能存在的问题是性能,但它应该始终有效。