多线程malloc、free的问题 - C++ Builder / Windows SDK/API
以下代码在C++ Builder 5.0中运行会死机,在VC6.0中运行也会死机,但是可以在VC6.0中加上编译选项/MDt(好象这样写的,记不太清楚了)就不会死机。
所以我觉得这个问题跟编译时是否用的是多线程运行时库有关,但就是不知道在C++ Builder 5.0中是否有这样的选项?
#include <windows.h>
unsigned long g_thread_num = 0; //统计线程运行的个数
bool g_run_flag = true; //控制线程的退出
HANDLE start_thread(void fn(HANDLE *))
{
HANDLE *handle;
unsigned long thread_id;
handle = (HANDLE *)malloc(sizeof(HANDLE *));
*handle = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)fn,
handle,
0,
&thread_id
);
return *handle;
}
void malloc_free_thread(HANDLE *handle)
{
void *p;
g_thread_num++;
while(g_run_flag)
{
p = malloc(64);
free(p);
Sleep(0); //释放一下CPU,免得CPU占用率太高
}
CloseHandle(*handle);
free(handle);
g_thread_num--;
}
void main(void)
{
for(int i=0;i<100;i++)
{
//启动多个线程
start_thread(malloc_free_thread);
}
system("pause");
g_run_flag = false;
while(g_thread_num)
{
//等待线程退出
Sleep(10);
}
}
[解决办法]
本来在 Win32 下编程就不建议使用 malloc free 等非线程安全的函数的
侯捷专门有一本译书说过这个方面的内容,不是每个编译器都会支持的
例如用 wsprintf 代替 sprintf
[解决办法]
console向导有多线程选项的
[解决办法]
你从TThread派生出线程子类就可以了,会自动设置多线程标志,mallo与free就可以自动线程安全了。不要使用winapi,就不会有问题。