最近开发一个小型的服务器系统(使用多线程),有时会在动态内存分配new发生访问异常。
后来看了一个文章 http://davidyu720.itpub.net/post/31716/462851,文章提示到多线程的工程需要修改编译选项为多线程库(我的系统以前是单线程库)。现请问大家:1.是不是只要改为多线程库就不会出现 分配new发生访问异常的错误?
2.哪位朋友能帮我讲下为什么单线程库偶尔会发生分配new发生访问异常?
3.单线程库跟多线程库的本质区别是什么?
后来看了一个文章 http://davidyu720.itpub.net/post/31716/462851,文章提示到多线程的工程需要修改编译选项为多线程库(我的系统以前是单线程库)。现请问大家:1.是不是只要改为多线程库就不会出现 分配new发生访问异常的错误?
2.哪位朋友能帮我讲下为什么单线程库偶尔会发生分配new发生访问异常?
3.单线程库跟多线程库的本质区别是什么?
CreateThread?要使这样的话 有问题正常应该使用_beginthread, _beginthreadex
单线程库为标准的C运行时库(LIBC.lib, LIBC.dll), 其中的很多函数像printf, malloc(包括new)等等, 在多线程程序运行中会发生不可知异常, 而多线程库是标准C运行时库的改进(MSVCRT.lib, MSVCRT.dll), 使这些函数在多线程程序中运行不会出现问题.
最后,你应该知道的是:工作线程异常退出或强行终止(用TerminateThread)都会使工作线程中分配的内存发生泄漏(Leaking), 而与本身代码正确无关.
akirya :由于我的工程是SDK的,不是MFC,所以只能用CreateThread;yjgx007:还想请教一个问题:按这样说,不管以后什么样的工程都应该使用多线程库?? 反正多线程库也支持单线程工程!(VS2005编译环境就只有多线程库)
一样可以使用_beginthreadex
最好使用多线程库
本身GUI界面也是作为一个独立线程在运行的.
_beginthread _beginthreadex是C库的。
在C程序中使用CreateThread绝对的有问题。