2025年CString在多线程中的问题

CString在多线程中的问题闲来没事 聊聊 CString 在多线程中很容易踩的坑 这个坑很可能存在于你现在的项目中 举例 int main CString str L test CString strThread1 str CString strThread2 str

大家好,我是讯享网,很高兴认识大家。

闲来没事,聊聊CString在多线程中很容易踩的坑,这个坑很可能存在于你现在的项目中

举例:

int main() { CString str = L"test"; CString strThread1 = str; CString strThread2 = str; //将两个参数传递到各自的线程中,以下使用伪代码 CThread thread1(strThread1); CThread thread2(strThread2); thread1.wait(); thread2.wait(); return 0; }

讯享网

不要以为strThread1和strThread2只是个临时变量,以值传递的方式传递到线程中就很安全,CString的内部较为复杂,有诸如引用计数,写时复制这样的功能,也就是说,在这段代码中str、strThread1以及strThread2是指向同一段内存的,多线程中操作一段内存的结果可想而知,呵呵!

在调试代码时可以证明这三个变量指向的是同一段内存:


讯享网

怎么处理这个奇葩的问题?本质上而言这是一个很高效的类,然而在某些场景下有可能会给我们带来致命的麻烦。

解决方案:

把上面的代码简单改下即可:

讯享网int main() { CString str = L"test"; CString strThread1 = str.GetBuffer(); CString strThread2 = str.GetBuffer(); //将两个参数传递到各自的线程中,以下使用伪代码 CThread thread1(strThread1); CThread thread2(strThread2); thread1.wait(); thread2.wait(); return 0; }

可以看到通过GetBuffer来赋值后 ,这三个CString对象就不再指向同一段内存空间了,即解决了该问题。

原理:

以CString的对象初始化(或者赋值时)另一个CString时,在其内部会决定是否采用引用计数的方式,而另一种是传入PCXSTR的构造函数(或者赋值),此时CString会申请空间并将字符串拷贝到内存空间。

注意事项:

CString的GetBuffer也有很多坑,可以看下我之前写的关于GetBuffer和ReleaseBuffer的文章,在ATL的分类中。

小讯
上一篇 2025-03-27 19:26
下一篇 2025-04-08 11:49

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/16230.html