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