gpt4 book ai didi

c++ - GlobalLock 多线程

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:14 25 4
gpt4 key购买 nike

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

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