多线程

  

       一个线程的开销包括:
      内核模式下的开销(内核
堆栈,对象管理所需内存)
      用户模式下的开销(线程局部存储、线程环境块、堆栈、CRT、MFC、COM等等等等)

      通常,线程数目的瓶颈在于线程自己的堆栈。Visual C++编译器默认设置是每个线程的堆栈
大小是1MB。当然,如果你在创建线程时指定较小的堆栈大小,你应该可以创建较多的线程。

      但是创建大量线程不是一个好的设计。每个线程创建和销毁的时候,Windows会调用已经加载的动态链接库的DLLMain,传递DLL_THREAD_ATTACH和DLL_THREAD_DETACH作为参数,除非动态库使用DisableThreadLibraryCalls禁用了这个通知。在创建大量线程的时候,这个开销是很大的。对于你这样的用后即弃的线程,你应该使用线程池。一个线程池示例可以在微软知识库找到。

     参数和局部变量的函数都存储在线程的堆栈。 如果声明局部变量具有大型值, 堆栈快速耗尽。 例如, 在以下代码示例函数要求堆栈来存储数组 1,200,000 个字节。

void func(void)
   {
     int i[300000];
     // Use 300,000 integers multiplied by 4 bytes per integer to store the array.
     return;
   }

要避免使用堆栈, 使用动态分配内存。 例如, 在以下代码示例函数动态分配内存。
void func(void)
   {
     int *i

     i = new int[400000];
     // More code goes here.
     return;
   }
   在此代码示例, 内存存储在堆栈代替。 因此, 函数不需要堆栈来存储数组 1,200,000 个字节。
由此也解开了为什么我在一个进程中创建大于2000个线程时导致程序异常退出,因为每个线程的默认堆
栈是1MB,2000*1MB = 2GB,my God!
可以在创建线程时指定线程堆栈大小,这样就能创建更多的线程了!但是前面提到,大量的创建线程并销
毁,会带来大量的系统开销,所以尽量避免创建大量线程,推荐使用线程池,但是偶现在还不会用,快去查查!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值