Sma*_*acL 16 c++ heap multithreading memory-management
如果我在C++(new或malloc)中的一个线程中分配内存,我可以在另一个线程中取消分配,或者两者都必须在同一个线程中发生吗?理想情况下,我想首先避免这种情况,但我很想知道它是合法的,非法的还是依赖于实现的.
编辑: 我目前使用的编译器包括VS2003,VS2008和嵌入式C++ 4.0,目标是XP,Vista,Windows 7和各种风格的Windows CE/PocketPC和Mobile.所以基本上所有微软都在一系列深奥的平台上.
nos*_*nos 20
通常,多线程系统上的malloc/new/free/delete是线程安全的,所以这应该没有问题 - 并且在一个线程中分配,在另一个线程中解除分配是很常见的事情.
由于线程是一个实现功能,它肯定是依赖于实现的 - 例如,某些系统要求您与多线程运行时库链接.
没有任何关于new/delete本身的东西阻止你在单独的线程中分配和解除分配.正如许多人所说,标准没有提到多线程 - 既不支持多线程,也没有任何东西阻止你使用任何标准工具.这既好又坏,因为你可以做任何你想做的事情,但语言没有直接的机制来帮助你安全地做到这一点.
但是,您可能需要解决许多潜在的技术问题.许多编译器具有实现new和delete的运行时库的多线程和单线程风格,因此您必须确保使用正确的.(VS 2008已经废除了单线程CRT,因此这不是问题.)更重要的是,您的软件必须从头开始设计为多线程感知,这对我们来说是最大的挑战.资源需要得到保护,所有权必须明确,并且您需要避免死锁和竞争条件.但是,虽然这可能是您在单独的线程中分配和解除分配时面临的最重要和最困难的挑战,但它与您的问题没有直接关系,所以我将把它留给另一个讨论.
| 归档时间: |
|
| 查看次数: |
8317 次 |
| 最近记录: |