MFC 中线程传递CString 是不安全的(转载)
安全 转载 mfc 传递 中线 CString
2023-09-14 09:07:09 时间
在MFC中,向线程传递CString变量参数时,很容易犯一个错误,就是使用一个超出生存期的变量,在主函数中定义的CString变量是局部变量,当主函数结束时,这个CString变量就会被析构,而却在另一个线程中继续使用,参数传递就会出现问题。
解决此问题,可以在主函数中new一个CString,在线程结束时在delete一下释放内存。或者声明一个全局变量,保证CString变量不会超出生存期,这样传递进线程的参数就可以正常使用了。
下面为示例代码:
1 DWORD WINAPI test::ProcessNotifyThread(LPVOID pParam)
2 {
3
4 CString* sTest = (CString*)pParam;
5 //AfxMessageBox(*sTest);
6 delete sTest;
7 return 0 ;
8 }
9
10 void test::OnBnClickedButton1()
11 {
12 // TODO: Add your control notification handler code here
13 CString *sTest = new CString;
14 *sTest = "hello";
15 LPVOID lpvoid=sTest;
16
17 CWinThread* pThread = AfxBeginThread((AFX_THREADPROC)test::ProcessNotifyThread, lpvoid);
18 }
CString类是很好用,但在多线程时最好不要用CString,因为MSDN明确说了,CString类是非线程安全的。
下面为摘抄的:
CString只保证类级的线程安全,
要做到对象级别的线程安全,需要你自己进行同步, 也就是说, 可以同时有N个线程在读, 但是写的时候,必须保证没有任何线程"正在"读和写 才可以写入.
1 CString str;
2
3 CCriticalSection cs;
4 cs->Lock( );
5 str+="abcdefg";..
6 do anything you want
7 cs->Unlock( );
解决方案:
传递char *
代码示例如下:
线程传递char*
1 DWORD WINAPI test::ProcessNotifyThread(LPVOID pParam)
2 {
3
4 char *pSectionName = (char *)lpvoid;
5 CString sSectionName;
6 sSectionName.Format("%s", pSectionName); return 0 ;
7 }
8
9 void test::OnBnClickedButton1()
10 {
11 // TODO: Add your control notification handler code here
12 CString str = _T("aaaa");
13 const char *pSectionName = (LPCTSTR)str;
14 CWinThread* pThread = AfxBeginThread((AFX_THREADPROC)test::ProcessNotifyThread, (LPVOID)pSectionName);
15 }
相关文章
- 【说站】java HashMap的不安全分析
- 智慧工地安全绳检测识别系统
- 组策略基本安全设置:【交互式登录:试图登录的用户的消息】和【拒绝通过远程桌面服务登录】
- MySQL如何安全删除数据(mysql怎么删除数据)
- Linux系统:一个安全的屏幕锁定(linux系统锁屏)
- Kubernetes 1.7 发布,安全强化、StatefulSet 更新及可扩展特性
- Linux给用户加密:安全保障保护(linux给用户加密码)
- Linux端口关闭:让安全更上一层楼(linux端口off)
- TrueCrypt安全审计团队发布验证版本
- 注意:全世界 97% 的银行都无法保障你存款的安全
- Kubernetes 1.7:安全加固、有状态应用更新和可扩展性
- MySQL转义字符函数:使得SQL语句中的特殊字符安全地被表示,防止SQL注入。(mysql转义字符函数)
- JSP结合MySQL实现安全登录功能(jspmysql登录)
- 安全Mysql注入:确保服务器权限安全(mysql注入权限)
- 探索MySQL不安全模式的风险与防范方法(mysql不安全模式)
- Oracle 9i 镜像文件快速安全下载(oracle9i镜像下载)