【问题标题】:can I alloc() in the main thread and free() in another?我可以在主线程中分配()并在另一个线程中释放()吗?
【发布时间】:2010-11-27 00:58:51
【问题描述】:

我有一个程序可以在 MacOS 和 Linux 上运行良好,并且可以使用 mingw 交叉编译到 Windows。最近我把程序做成了多线程的。

程序的当前设计在主线程中分配内存并在从属“工作”线程中释放。这在 MacOS 和 Linux 上不是问题,因为 malloc/free 系统是多线程的。

不过,我担心交叉编译。我使用的 mingw 版本是从 MacOS 端口构建的。这是 2004 年以来 G++ 的一个非常古老的版本(版本 3.4.5)。我尝试构建更新版本的尝试没有成功(我想构建一个 64 位版本,但放弃了)。我从http://sourceware.org/pthreads-win32 获得pthreads。

我担心的是 3.4.5 中的 malloc & free 系统不是多线程的。

问题:

  1. 我是否应该重写我的程序,以便将要释放的内存块传递回主线程以在那里释放?

  2. 我应该尝试升级到更新的 mingw 吗?

  3. 除了大量的测试之外,还有什么方法可以发现这些并发问题?这对我来说感觉不太好。

谢谢!

【问题讨论】:

  • 所以回想起来,我得出的结论是选项#1 不起作用,因为线程中还有许多其他情况需要调用 malloc() 和 free()。我可以给每个线程它自己的内存分配器,但这是错误的方向。

标签: pthreads mingw mingw32


【解决方案1】:

为什么说 malloc 和 free 不是多线程的?

mingw32 默认会链接到 msvcrt.dll,这是一个多线程 dll。见[1]。 [2] Microsoft 提供的单线程库,但它仅可用于静态链接。

PS:您提到您正在交叉编译,但您似乎是在 windows 中编译 windows 程序。在这种情况下,为什么不从 www.mingw.org 下载二进制文件? (不过,在他们的下载中找出所需的文件很痛苦)

1-http://msdn.microsoft.com/en-us/library/abx4dbyh%28v=VS.71%29.aspx

2- 见 [1]。在 Visual Studio 2005 中删除 http://msdn.microsoft.com/en-us/library/abx4dbyh%28v=VS.80%29.aspx

【讨论】:

  • 其实这是正确的答案,也是我实现系统的方式。我在生产者线程中分配并在消费者线程中释放。 malloc 和 free 是多线程的。这一切都完美无缺。很干净。
  • 而且,继续评论,我最初是使用 Mingw 3.x 版编译器从我的 Mac 交叉编译到 Windows。但是 4.x 编译器更好,它只运行托管,所以我下载了二进制文件,它们工作正常。但这确实使编译变得更加复杂。
【解决方案2】:
  1. 我会避免这种情况。听起来您想回避主要问题。
  2. 是的,无论如何这都是个好主意...
  3. 检测与内存分配/释放相关的并发问题的一种方法是内存泄漏检测器。我不确定 valgrind 是否适用于 cygwin。

【讨论】:

  • 我没有使用cygwin,我使用的是mingw。我很高兴能升级到更新的版本。知道如何在 Mac 或 Linux 上构建它吗?根据mingw.org/wiki/LinuxCrossMinGW,“在撰写本文时,MinGW 项目不支持任何官方版本的 GCC,比 GCC-3.4.5 更新,在任何平台上用作跨托管 MinGW 开发工具。这不太可能在正式支持的稳定 GCC-4.x 版本发布之前进行更改,以便在 MS-Windows 平台上本地使用。”
  • Ick,考虑到 GCC 4 已经存在了多少年,这令人失望。您的应用程序是否有任何特性阻止您在 Windows 上使用 Microsoft 工具?
  • 该程序使用 GNU flex、automake 和其他工具构建。我过去维护过在 VC++ 和 GCC 上交叉编译的代码,但 VC++ 版本总是落后。 mingw 和 cygwin 的好处是您可以使用相同的工具链在两个平台上交付程序。在放弃之前,我将花费 很长 时间尝试使用 Mingw 或 Cygwin 找到多线程解决方案。
  • 那么我认为唯一真正可行的解决方案是坚持使用当前的工具链并尝试找到解决方法,例如您提到的同线程分配/释放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2015-09-22
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多