CString不是线程安全的

CString不是线程安全的

我们用MFC开发时经常会用到CString类,无可否认,CString类是很好用,但很少人注意到CString类不是线程安全的。一般地,界面编程都是在主线程,很少用到多线程,所以不会遇到什么问题。但是,当我们多个线程同时操作同一个CString类型变量时,就可能会出现内存地址错误,最终导致进程异常退出。内存错误导致的问题也很难调查,通常导致内存错误的地方没有马上报异常,而且在程序的其他地方才捕获异常。
CString类的Debug版本和Release版本不完全一样,Debug版本则直接分配(MFC在Debug版本有内存管理,主要是为了排错,内存泄漏等),CString类在Release版本会使用定长内存管理(CFixedAlloc类),主要管理是4个长度的内存,如下:
1 AFX_STATIC CFixedAlloc _afxAlloc64(ROUND4( 65 * sizeof (TCHAR) + sizeof (CStringData)));
2 AFX_STATIC CFixedAlloc _afxAlloc128(ROUND4( 129 * sizeof (TCHAR) + sizeof (CStringData)));
3 AFX_STATIC CFixedAlloc _afxAlloc256(ROUND4( 257 * sizeof (TCHAR) + sizeof (CStringData)));
4 AFX_STATIC CFixedAlloc _afxAlloc512(ROUND4( 513 * sizeof (TCHAR) + sizeof (CStringData)));
这样做应该是防止内存碎片和提高效率,由于CString类都会重用分配的定长内存,所以一般异常的地方大多数也是在CString操作的地方。有兴趣可以看看CString类的实现。
避免这样的问题最简单的办法就是加锁或者不用CString类。加锁用临界区就可以,实现比较简单,在这里不多说。

你可能感兴趣的:(CString不是线程安全的)