我的应用程序中似乎存在 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/