首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

多线程malloc、free的有关问题

2012-04-07 
多线程malloc、free的问题 - C++ Builder / Windows SDK/API以下代码在C++ Builder 5.0中运行会死机,在VC6.

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

热点排行