如果我在 C++ 中的一个线程中分配内存,我可以在另一个线程中取消分配它吗
Posted
技术标签:
【中文标题】如果我在 C++ 中的一个线程中分配内存,我可以在另一个线程中取消分配它吗【英文标题】:If I allocate memory in one thread in C++ can I de-allocate it in another 【发布时间】:2011-01-22 18:17:17 【问题描述】:如果我在 C++ 中的一个线程(new 或 malloc)中分配内存,我可以在另一个线程中取消分配,还是必须在同一个线程中进行?理想情况下,我想首先避免这种情况,但我很想知道它是合法的、非法的还是依赖于实施的。
编辑:我目前使用的编译器包括 VS2003、VS2008 和 Embedded C++ 4.0,针对 XP、Vista、Windows 7 和各种风格的 Windows CE/PocketPC 和 Mobile。所以基本上所有微软,但跨越一系列深奥的平台。
【问题讨论】:
C++ 标准中根本没有提到线程。这都是特定于实现的。 如果你告诉使用你正在使用的 wwitch 编译器、操作系统等,你可能会得到一些更有帮助的答案 @Ian,添加了编译器和操作系统详细信息。 面对大数据项的高效线程间通信,除了线程安全容器中更复杂的线程间通信对象池之外,别无选择。 【参考方案1】:很抱歉这个无益的答案,但 C++ 标准没有线程,所以所有的赌注都没有了!
但是,一些 C++ 编译器和运行时系统支持线程,在这些方面,您通常必须告诉链接器使用标准库的线程安全版本。
【讨论】:
【参考方案2】:通常,多线程系统上的 malloc/new/free/delete 是线程安全的,所以这应该没问题 - 在一个线程中分配,在另一个线程中释放是很常见的事情。
由于线程是一种实现特性,它当然是依赖于实现的——例如某些系统要求您链接多线程运行时库。
【讨论】:
【参考方案3】:为了能够在一个线程中分配并在另一个线程中释放,您需要运行时库是线程安全的。自 Visual Studio 2005 以来,Microsoft 运行时都是线程安全的,Visuals Studio 2003 提供单线程和线程安全的运行时 - 如果您使用线程,显然您应该选择与多线程的运行时链接。
至于它是合法的、非法的还是依赖于实施的,我想说以上都不是。它完全超出了标准的范围,因为它根本没有提到线程。
【讨论】:
感谢 Joe,非常值得了解,因为我们在 VS2003 上仍有一些开发。 VS2003 同时提供多线程和单线程运行时——您只需确保链接到正确的。【参考方案4】:我相信它是实现定义的,因为 C++ 标准没有说明线程如何共享地址空间。
【讨论】:
【参考方案5】:之所以有效,是因为线程属于同一个进程并共享相同的地址空间..
【讨论】:
【参考方案6】:new/delete 本身并不会阻止您在单独的线程中分配和解除分配。正如许多人所说,标准对多线程保持沉默——既不支持多线程,也没有任何东西阻止您使用任何标准工具来实现它。这有好有坏,因为您可以做任何您想做的事情,但是该语言没有提供直接的机制来帮助您安全地做到这一点。
但是,您可能需要应对许多潜在的技术问题。许多编译器具有实现 new 和 delete 的多线程和单线程风格的运行时库,因此您必须确保使用正确的。 (VS 2008 已经取消了单线程 CRT,所以这不是问题。)更重要的是,您的软件必须从头开始设计为支持多线程,这对我们来说是最大的挑战。资源需要受到保护,所有权必须明确,并且您需要避免死锁和竞争条件。但是,虽然这可能是您在单独的线程中分配和取消分配时面临的最重要和最困难的挑战,但它与您的问题没有直接关系,所以我将把它留到另一个讨论中。
【讨论】:
感谢约翰的回复。我故意将问题保持在狭窄的范围内,因为我知道讨论编写多线程代码的各种潜在陷阱需要一本大书。我说这个我自己不止一次陷入了许多所说的坑;) 这就像玩旧的动视游戏,不是吗?以上是关于如果我在 C++ 中的一个线程中分配内存,我可以在另一个线程中取消分配它吗的主要内容,如果未能解决你的问题,请参考以下文章