C ++`free`函数是否是线程安全的?

时间:2011-03-16 19:40:59

标签: c++ multithreading visual-studio-2008 memory-management

也就是说,如果我的C ++应用程序使用malloc在一个线程中分配内存,free将成功取消分配内存,如果从另一个线程调用,或者我可以指望它抛出异常?两个线程都属于同一个进程。我正在使用Visual Studio 2008.谢谢。

5 个答案:

答案 0 :(得分:4)

当前标准对线程没有任何保证。在大多数实现中,可以从不同的线程调用mallocfree。 Visual C ++堆代码也序列化对堆的访问,所以你应该没问题。

答案 1 :(得分:2)

如果mallocfree正确同步,则在另一个线程中释放内存非常精确且安全。而且,根据C ++ 0x标准,这种说法是正确的。正如@Ashot所提到的,当前的C ++ 03标准只涉及单线程执行模型

答案 2 :(得分:1)

在这个意义上它是线程安全的(malloc池是进程全局的,而不是线程局部的),但是如果在另一个线程正在调用malloc()时被调用,那么就不会表现得很安全。 free()

答案 3 :(得分:1)

当前的C ++标准甚至不知道线程。所以在标准方面,我认为你不能判断它是否正常。但是程序中的所有线程共享相同的地址空间,因此在其他线程中释放对象必须是OK。

答案 4 :(得分:0)

如果C编译器和OS支持线程,那么它将是安全的。

如果您的编译器在Windows上,那么您需要确保链接到多线程运行时库。或者,如果您的编译器支持-pthread选项或类似的东西,那么它也是安全的。

如果编译器确实有像-pthread这样的标志,那么除非你使用那个标志,否则不要假设它是线程安全的。使用该标志将链接到不同的库并设置不同的预处理器宏。完全可能在给出该标志时链接完整的不同线程安全C运行时。