8

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

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

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

4

1 回答 1

6

唯一具有线程(因此可以与您的问题相关)的 C 标准是 C11,它指出:

为了确定数据竞争的存在,内存分配函数的行为就像它们只访问可通过其参数访问的内存位置,而不是其他静态持续时间存储。

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

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

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

我不知道您从哪里得出的断言malloc对于旧 Unix 来说不是线程安全的,具有不实现该线程安全的线程的系统几乎没用。在这样的旧系统上可能存在的问题是性能,但它应该始终可以正常工作。

于 2013-05-12T20:48:35.773 回答