标签:
在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现。而对于后台的数据处理。我们可能会用到多线程来处理。
那么对于大多数人(尤其是我这样的菜鸟),一个比較快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程。当一两个线程还是能够得。当有3个或者3个以上的线程出现时,极可能出现内存泄漏。原因分析例如以下:
CWinThread的多线程不安全性:
由于 CWinThread 会调用_beginthreadex来初始化C执行时库。而相同地,假设线程被强制终止(TerminateThread),由于 TerminateThread是不会去管 C执行时库的,从而,导致部分和引用计数相关的C执行时数据的内存释放出现故障。最典型的特征是,使用STL库的静态变量
内存回收将出错,从而导致进程退出时误报异常。
此外,假设AfxBeginThread频繁进行回收和分配线程,假设不严格操作,也会导致崩溃。
VC6中,应该严格控制STL库的使用,避免MFC库和STL库并存,否则,会有非常多问题。
原因:
AfxBeginThread在内部直接调用了CreateThread创建线程而不是c语言下推荐的beginthreadex函数,而这两个函数是有差别的,主要是c执行库的历史遗留问题造成的。
在多线程环境中存在问题的C/C++执行期库变量和函数包含errno、_doserrno、strtok、_wcstok、strerror、_strerror、tmpnam、tmpfile、asctime、_wasctime、gmtime、_ecvt和_fcvt等。若要创建一个新线程。绝对不要调用操作系统的CreateThread函
数。必须调用C/C++执行期库函数_beginthreadex。传递给该函数的參数也
保存在该数据块中。_beginthreadex确实从内部调用CreateThread,由于这是操作系统了解怎样创建新线程的唯一方法。###能够看出调用_beginthreadex时分配了额外的内存空间。首
假设返回
你能够參照_beginthreadex源码来进行理解。
引申阅读:
关于_beginthreadex和CreateThread的差别
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/5224576.html