我正在 MSVC++2010 中编写带有导出函数的 Win32 DLL。其中一些函数将文件名返回为 LPCSTR
。因为我以前有时需要摆弄字符串,所以我目前正在使用一个长度为 32184 的全局缓冲区变量,它应该涵盖 Windows 中可能出现的任何文件名,然后我总是初始化并返回需要字符串的地方。
我的老板使用 VB6 遗留应用程序中的这个库。他现在告诉我他需要它是线程安全的:对我来说不幸的是,由于 VB6 的事件驱动行为,即使另一个函数尚未返回,也可能会在我的库中调用一个函数。当然,这意味着我不能依赖单个内部缓冲区,而是必须在每次需要时创建一个然后返回它。
2 个问题:
我严重依赖 Windows API 函数,例如
FindFirstFile
和来自filesystem
和regex
库的 Boost 函数。我可以假设它们都是线程安全的吗?如果我每次想要返回一个字符串时都必须在堆上创建一个新的缓冲区,我应该在哪里再次释放内存?
最佳答案
- Windows API 函数通常是线程安全的,但有一定的局限性(例如,您不能同时从两个线程在同一个句柄上
FindNextFile
,但可以使用两个不同的句柄)。对于 boost 函数,请查阅文档,但一般来说,文件系统/正则表达式函数应该是安全的,只要您不同时在两个线程之间使用同一个对象。 - 您必须让 VB6 应用程序回调以在完成后释放该字符串。您可能还想考虑将 DLL 编写为 COM 库;从 COM 调用返回的 BSTR 将在不再需要时由 VB6 自动释放。
关于c++ - C++ DLL 中的线程安全字符串缓冲区变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6444831/