如果我在C ++中的一个线程中分配内存,我可以在另一个线程中取消分配

时间:2010-03-02 14:43:02

标签: c++ multithreading memory-management heap

如果我在C ++(new或malloc)中的一个线程中分配内存,我可以在另一个线程中取消分配,或者两者都必须在同一个线程中发生吗?理想情况下,我想首先避免这种情况,但我很想知道它是合法的,非法的还是依赖于实现的。

编辑我目前正在使用的编译器包括VS2003,VS2008和嵌入式C ++ 4.0,目标是XP,Vista,Windows 7和各种风格的Windows CE / PocketPC&移动。基本上所有的微软都是在一系列深奥的平台上。

6 个答案:

答案 0 :(得分:19)

通常,多线程系统上的malloc / new / free / delete是线程安全的,所以这应该没问题 - 在一个线程中分配,在另一个线程中解除分配是很常见的事情。

由于线程是一个实现功能,它当然是依赖于实现的 - 例如某些系统要求您链接多线程运行时库。

答案 1 :(得分:6)

没有任何关于new / delete本身的东西阻止你在单独的线程中分配和解除分配。正如许多人所说,标准没有提到多线程 - 既没有支持多线程,也没有任何东西阻止你使用任何标准工具。这既好又坏,因为你可以做任何你想做的事情,但语言没有直接的机制来帮助你安全地做到这一点。

但是,您可能需要解决许多潜在的技术问题。许多编译器都具有运行时库的多线程和单线程风格,可实现新的&删除,所以你必须确保使用正确的。 (VS 2008已经废除了单线程CRT,因此这不是问题。)更重要的是,您的软件必须从头开始设计为多线程感知,这对我们来说是最大的挑战。资源需要得到保护,所有权必须明确,并且您需要避免死锁。竞争条件。但是,虽然这可能是您在单独的线程中分配和解除分配时面临的最重要和最困难的挑战,但它与您的问题没有直接关系,所以我将把它留给另一个讨论。

答案 2 :(得分:2)

为了能够在一个线程中分配并在另一个线程中释放,您需要运行时库是线程安全的。自Visual Studio 2005以来,Microsoft运行时都是线程安全的,Visuals Studio 2003提供了单线程和线程安全的运行时 - 显然,如果你使用线程,你应该选择与多线程运行时链接。

关于它是合法的,非法的还是依赖于实现的,我不会说上述情况。它完全超出了标准的范围,因为它根本没有提到线程。

答案 3 :(得分:1)

很抱歉这个无用的答案,但是C ++ Standard没有线程,所以所有的赌注都已关闭!

但是,有些C ++编译器和运行时系统支持线程,你必须告诉链接器使用标准库的线程安全版本。

答案 4 :(得分:1)

我认为它是实现定义的,因为C ++标准没有说明线程如何共享地址空间。

答案 5 :(得分:0)

它起作用,因为线程属于同一个进程并共享相同的地址空间..