正在阅读:《编程高手箴言》读后感(3)《编程高手箴言》读后感(3)

2004-04-07 10:02 出处:CSDN 作者:seacloud 责任编辑:sdq

  当用_beginThread来创建,而用CloseHandle来关闭线程时,这些复制的全局结构就不会释放,这就有了内存泄漏。
===================================================
  其实,一个正确的程序不会出现上面的情况,否则只能说明还没搞明白多线程的程序怎么写。为什么这么说呢?你如果在标准的C环境里,就用_beginthread好了,然而文档清清楚楚的说明了这个时候要用_endthread来结束线程,你如果用CloseHandle只能说明你是自作聪明了。在VC/MFC环境里,我就直接AfxBeginThread或者直接用CWinThread了,这样也同样没有问题。

  其实看看VC带的CRT源码:
  /*
   * Allocate and initialize a per-thread data structure for the to-
   * be-created thread.
   */
  if ( (ptd = _calloc_crt(1, sizeof(struct _tiddata))) == NULL )
  goto error_return;
  一切都是这个_calloc_crt引起的,不过话说回来,你按照规则走就不会出问题。

  还有一种线程根本不会退出,它一直运行着循环的线程。
===================================================
  这里好像容易引起误解,其实线程就一种,至于你让不让它结束,何时让它结束,完全是程序员自己的事。这句话可能会给新手同志误解,还是说明一下了。

  一个KERNEL32句柄只在进程自身内部有效,企图将一个进程柄用于另一个进程是没有意义的。
===================================================
  这句话不太准确,一些全局唯一的句柄,比如Process Handle,完全可以被别的进程使用。假如进程B知道了进程A的句柄,而且在权限允许的情况下,就可以用TerminateProcess来结束A线程。

  一个真正的Win32程序不会耗尽CPU时间等待某些时间发生。
===================================================
  事实上,Win32系统里应用程序不会耗尽CPU时间的,因为现在的Windows不会象过去那样等待一个程序让出控制权,而是可以主动的剥夺一个程序的CPU时间片,只要是操作系统认为应该的时刻。你完全可以让你的程序 while (1); 而这个时候你的Winamp还会给你放mp3的,不会有任何停顿。但是通常我们不会用一个循环去不停的检测某个标志,尤其在消息处理函数里要避免这种做法,因为消息处理函数的停顿在外观上的表现就是你的程序“失去响应”。解决办法可以是开个线程去循环或者用event之类的notify机制。


察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品