2012-11-27 166 views
1

我用C \ C创建无锁队列++,队列工作正常,但我得到的错误时,Visual Studio显示,它是免费的运转,并且它崩溃了此功能的Windows堆损坏C++ C

的extern “C” _CRTIMP INT __cdecl _CrtIsValidHeapPointer( 常量无效* pUserData)

而且这种情况发生时,尊者很多读线程(使用自由线程),如果我删除无它正常工作与任意数量的线程或者如果我把简单的printf(“随机东西”); (这有点慢),它适用于任何数量的线程。所以我只是不知道该怎么办:(看起来好像很多线程试图释放内存窗口无法处理它,这是可以解决的问题吗?另外,当变量地址变成'magic'时, (0xABABABAB,0xCDCDCDCD ..),我发现,这些也与堆..

在linux中,使用POSIX线程没有得到任何的问题,正常工作与任意数量的线程。

所以问题为什么放慢线程帮助(或这是巧合吗?),以及如何不会减慢摆脱堆问题 有关堆内存的任何意见,欢迎

来源:? queue.c queue.h

+3

听起来像是你有一个竞争条件,但没有人能为你使用的只是一个普通的,线程安全的帮你无需任何代码 – Collin

+0

只要处理堆来实现队列,它不是无锁的。你使用原子进行变量访问吗?简单变量赋值不会跨线程工作。无论它在测试中是否有效 - 在足够的负载下都会失效。 – ActiveTrayPrntrTagDataStrDrvr

+0

用代码更新。队列工作正常,但负载很大,崩溃。并且总是在出队方法中崩溃。 –

回答

1

我面临类似的问题,而我试图从MFC gui调用我的一个DLL。

你很可能得到这类问题,如果你通过静态链接和其他DLL/EXE作为对MSVC运行时动态链接所做的DLL之一。

它似乎静态链接对MSVC运行时DLL在不同的上下文对MSVC运行时动态链接DLL运行,即使他们是在同一个应用程序中使用。

基本上,如果你免费或返回这是从两个不同的上下文中创建一个指针,发生堆损坏。如果你在VS中调试程序,它不会显示任何错误。但是如果你运行它,它将在退出返回上下文后显示堆损坏错误。

的一种可能的解决方案是动态对MSVC运行时链接所有的DLL。

希望这有助于

问候