CString::LoadString() 线程安全吗?
Posted
技术标签:
【中文标题】CString::LoadString() 线程安全吗?【英文标题】:Is CString::LoadString() thread-safe? 【发布时间】:2014-09-25 16:02:47 【问题描述】:我正在实现一个多线程应用程序,该应用程序从使用 MFC 编写的遗留应用程序中调用模块。
当我只使用一个线程运行我的代码时,它可以完美运行,但如果我使用多个线程运行它,当CString::LoadString()
调用AfxGetResourceHandle()
时,我总是会得到一个断言。调用LoadString()
的字符串是本地字符串,因此根本不共享。
如果我在CString::LoadString()
之前添加一个互斥锁,一切正常,但由于遗留应用程序的大小和此方法的普遍使用,此解决方案将难以实施并且会减慢应用程序的速度。
我查看了 MS 文档,它没有提到线程安全等。
您了解LoadString()
和多线程环境吗?我的应用程序中的所有 DLL 都具有相同的字符集,它们都处于调试模式,并且都使用 MFC 共享 DLL。
【问题讨论】:
LoadList()
?你的意思是LoadString()
?
The string that is invoking LoadList() is a local string, so it is not being shared at all
字符串是CString
吗? AFAIK,CString 的引用计数,所以本质上,它们是共享的。
断言的本质是什么? FWIW,您的问题似乎与此非常相似:***.com/questions/8505435/…
对不起,是LoadString,你是对的。
【参考方案1】:
通常您只能从使用 CWinThread 创建的线程访问 MFC 对象。您没有提供在辅助线程上获得的确切断言,但我猜您的“其他”线程是以其他方式创建的。有关 MFC 与多线程的详细信息,请参阅 MSDN。
【讨论】:
实际上我使用 STL C++11 线程创建了我的线程。顺便说一句,我怎样才能从 .NET 上创建的线程调用 MFC 的东西?以上是关于CString::LoadString() 线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章