0

我有一个程序可以在 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. 除了大量的测试,还有什么办法可以找到这些并发问题吗?这对我来说感觉不太好。

谢谢!

4

2 回答 2

1
  1. 我会避免这种情况。听起来你想回避主要问题。
  2. 是的,无论如何这都是个好主意……
  3. 检测与内存分配/释放相关的并发问题的一种方法是内存泄漏检测器。我不确定 valgrind 是否适用于 cygwin。
于 2010-11-27T01:14:05.930 回答
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

于 2011-01-13T13:28:37.630 回答