我希望我的C程序即使在非常老的Unix操作系统上也可以移植,但问题是我正在使用pthreads和动态分配(malloc)。我所知道的所有Unix都有一个线程安全的malloc(Linux,* BSD,Irix,Solaris)但是C标准并不能保证这一点,而且我确定有很老的版本,这不是真的。
那么,是否有一些平台列表需要使用互斥锁来包装malloc()调用?我打算编写一个./configure测试,检查当前平台是否在该列表中。
另一种选择是测试malloc()的线程安全性,但我知道没有确定性的方法来做到这一点。关于这个的任何想法呢?
答案 0 :(得分:6)
唯一具有线程的C标准(因此可以与您的问题相关)是C11,其中声明:
为了确定数据竞争的存在,记忆 分配函数表现得好像只访问内存一样 可通过参数访问的位置,而不是其他静态的 持续时间存储。
或者换句话说,只要两个线程没有将相同的地址传递给realloc
或free
,所有对内存函数的调用都是线程安全的。
对于POSIX,这就是你现在可以找到的所有Unix':
除非另有明确说明,否则IEEE Std 1003.1-2001的系统接口卷中定义的每个功能都是线程安全的。
我不知道你从哪里断言malloc
对于旧的Unix来说不是线程安全的,一个没有实现该线程安全的线程的系统几乎没用。在这样一个旧系统上可能存在的问题是性能,但它应该始终有效。