gpt4 book ai didi

c++ - parallel_for 函数导致内存泄漏(有时)

转载 作者:行者123 更新时间:2023-11-30 04:36:26 24 4
gpt4 key购买 nike

我正在制作一个简单的 native MFC 应用程序,我正在使用并发命名空间来执行一个简单的并行程序(绘制一个 Mandelbrot 集)。到目前为止,该程序非常基础,单击一个按钮并行绘制,另一个按钮串行绘制。串行执行功能非常基础,画出正确的画面。与并行执行功能一样,但是当运行调试构建并退出程序时,输出告诉我存在内存泄漏。

代码如下:

void CMandelbrotView::DrawSetParallel() {
// Get client area dimension which will be the image size
RECT rect;
GetClientRect(&rect);
//GetClientRect(pDC, &rect);
int imageHeight(rect.bottom);
int imageWidth(rect.right);

const double realMin(-2.1); // Minimum real value
double imaginaryMin(-1.3); // Minimum imaginary value
double imaginaryMax(+1.3); // Maximum imaginary value
// Set maximum imaginary so axes are the same scale
double realMax(realMin+(imaginaryMax-imaginaryMin)*imageWidth/imageHeight);

// Get scale factors to convert pixel coordinates
double realScale((realMax-realMin)/(imageWidth-1));
double imaginaryScale((imaginaryMax-imaginaryMin)/(imageHeight-1));

CClientDC hdc(this); // DC is for this view
OnPrepareDC(&hdc); // Get origin adjusted

critical_section cs; // Mutex for BitBlt() operation
parallel_for(0, imageHeight, [&](int y) // Iterate parallel over image rows
{
cs.lock(); // Lock for access to client DC
// Create bitmap for one row of pixels in image
HDC memDC = CreateCompatibleDC(hdc); // Get device context to draw pixels
HBITMAP bmp = CreateCompatibleBitmap(hdc, imageWidth, 1);
cs.unlock(); // We are done with hdc here so unlock
HGDIOBJ oldBmp = SelectObject(memDC, bmp); // Select bitmap into DC

double cReal(0.0), cImaginary(0.0); // Stores c components
double zReal(0.0), zImaginary(0.0); // Stores z components

zImaginary = cImaginary = imaginaryMax - y*imaginaryScale;
for(int x = 0; x < imageWidth; x++) // Iterate over pixels in a row
{
zReal = cReal = realMin + x*realScale;
// Set current pixel color based on n
SetPixel(memDC, x, 0, Color(IteratePoint(zReal, zImaginary, cReal, cImaginary)));
}

cs.lock(); // Lock to write to hdc
// Transfer pixel row to client area device context
BitBlt(hdc, 0, y, imageWidth, 1, memDC, 0, 0, SRCCOPY);
cs.unlock(); // Release the lock

SelectObject(memDC, oldBmp);
DeleteObject(bmp); // Delete bmp
DeleteDC(memDC); // and our working DC
});}

并行执行代码不同于串行执行代码,它并行创建 Mandelbrot 图像的单独行,并使用临界区锁来确保线程不会争夺同一个设备上下文句柄。

现在我说有时会报告内存泄漏的原因是因为运行发布版本不会导致报告内存泄漏。此外,当多次运行并行执行功能时,我并没有真正注意到更多的内存被用完,我有 6GB 的 RAM,以防有人想知道。就性能而言,我的四核机器实际上确实将串行执行的计算+绘图速度提高了大约 4 倍。我在msdn网站上也看到过类似的问题,但用处不大,因为这可能是VS的一个bug。无论如何,我想要一个并行程序员的意见。

最佳答案

此问题记录在 fix-list 中对于 VS2010 SP1。回馈文章is here .请注意,SP1 目前仍处于测试阶段,因此请避免将其安装在重要的生产机器上。下载 is here .

关于c++ - parallel_for 函数导致内存泄漏(有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com