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() 线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java并发/多线程系列——线程安全篇

Java并发/多线程系列——线程安全篇

使我的代码线程安全时遇到问题

不会吧,你连Java 多线程线程安全都还没搞明白,难怪你面试总不过

Linux线程安全篇

WPF线程安​​全和页面之间的通信