我认为我的应用程序中的GlobalLock存在问题。我说似乎是因为我无法通过逐步解决来见证该问题,但是当我让它运行时,它会在两个位置之一中断。

该应用程序具有多个线程(例如2),可以同时读取和写入PDF文件中的位图。每个线程处理一个不同的文件。

它打破的第一个位置,我正在从pdf中读取一个dib,称为OCRed。 OCR正在读取位图上的字符并将其转换为字符串数据。第二个位置是在创建新PDF时,将字符串数据添加到位图上。

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

GlobalAlloc(GMEM_MOVEABLE, uBytes);

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

似乎正在读取一个文件,而另一个文件正在同时写入一个副本。似乎没有任何模式可以对其执行处理。

现在我知道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/

10-11 15:55