读书人

多线程malloc、free的有关问题

发布时间: 2012-04-07 17:31:51 作者: rapoo

多线程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,就不会有问题。

读书人网 >C++ Builder

热点推荐