c++ - GlobalLock 多线程

标签 c++ multithreading winapi memory

我的应用程序中似乎存在 GlobalLock 问题。我说似乎是因为我还没有能够通过单步执行来见证这个问题,但是当我让它运行时它会在两个位置之一中断。

该应用程序有多个线程(比如 2 个)同时从 PDF 文件读取和写入位图。每个线程处理不同的文件。

它破坏的第一个位置我正在阅读 pdf 中的 dib 以进行 OCR。 OCR 是读取位图上的字符并将其转换为字符串数据。第二个位置是在创建新 PDF 时在位图上添加了字符串数据。

GlobalLock 正在由以下创建的 HANDLE 上使用:

GlobalAlloc(GMEM_MOVEABLE, uBytes);

我要么得到一个 AccessViolationError(总是在第一个实例中),要么得到返回 NULL 指针的 GlobalLock。 (第二次出现)

似乎正在读取一个文件,同时正在写入另一个文件的拷贝。它发生在哪些文件上似乎没有模式。

现在我了解到 VC++ 运行时自 2005 年以来一直是多线程的(我正在使用 VS2010 和 2008 工具链)。但是 GlobalLock 是运行时的一部分吗?在我看来,它更像是一个独立于平台的东西。

我想避免只是在 globallock 和 globalunlock 周围放置一个 CRITICAL_SECTION 来让它们工作,或者至少不知道我为什么要这样做。

谁能告诉我更多有关 GlobalLock/Unlock 的信息?
-离开水的鱼

最佳答案

首先,提供 Global* 堆例程是为了与 16 位窗口兼容。它们仍然有效,但没有真正的理由再使用它们,除了与仍然使用全局堆对象句柄的例程的兼容性。请注意,GlobalLock/GlobalUnlock 不是线程锁 - 它们会阻止内存移动,但多个线程可以同时对同一对象进行 GlobalLock。

也就是说,它们在其他方面是线程安全的;它们在内部采用堆锁,因此无需在每次 Global* 调用时都使用自己的锁。如果您遇到这样的问题,这表明您可能正在尝试 GlobalLock 已释放的对象,或者您可能正在破坏堆(堆溢出、释放后使用等)。您可能还缺少对堆对象的内容 的线程同步 - Global* API 不会阻止多个线程同时访问或修改同一对象。

关于c++ - GlobalLock 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422642/

相关文章:

c++ - 如何以多态方式无限嵌套对象

c++ - C++ 服务的 mod_gsoap 错误

android - 在一个线程上关闭 SQLite 数据库会破坏在另一个线程上打开的数据库

android - 如何解决致命异常 : Thread-11

c# - 是否可以始终调用而不是检查 InvokeRequired?

c++ - 如何最小化 USB 2 的延迟

c++ - 在经典 C++ WinAPI (Win32) 应用程序中获取 Windows 10 主题颜色

winapi - 如何绘制到设备上下文

c++ - 枚举窗口时出现问题

windows - MFC中如何获取子菜单?