每次一用到多线程就是到网上去找找资料,以为当时记住了,就永远记住了,其实几天,几星期或者几个月后就会忘记的一干二净,所以想了下,还是记录下吧。
在windows上创建线程的方法有:
1、CreateThread.
2、_beginThread/_endThread, _beginThreadex/_endThreadex.
3、AfxBeginThread/AfxEndThread
在侯捷的《win32多线程程序设计》一书中这样说到:
如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C runtime library,并使用_beginthreadex和_endthreadex:
1 使用malloc()和free(),或是new和delete
2 使用stdio.h或io.h里面声明的任何函数
3 使用浮点变量或浮点运算函数
4 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()
下面也有个网上的说法,在这摘抄下,原文不知道是那的(感觉在本国都是天下文章千篇一律- -!):
1. Create/EndThread是Win32方法开始/结束一个线程
_beginthreadx/_endthreadex是C RunTime方式开始/结束一个线程
AfxBeginThread是在MFC中开始/结束一个线程
2.直接在CreateThread API创建的线程中使用sprintf,malloc,strcat等涉及CRT存储堆操作的CRT库函数是很危险的,容易造成线程的意外中止。 在使用_beginthread和_beginthreadex创建的线程中可以安全的使用CRT函数。但是必须在线程结束的时候相应的调用_endthread或_endthreadex
3._beginthread成对调用的_endthread函数内部隐式的调用CloseHandle关闭了线程句柄,而与_beginthreadex成对使用的_endthreadex则没有关闭线程的句柄,需要显示的调用CloseHandle关闭线程句柄,不要使用_beginthread,使用._beginthreadex代替之。
4.尽量不要在一个MFC程序中使用_beginthreadex()或CreateThread()。
5.没有使用到MFC的线程尽量用_beginthreadex启动。
6.如果在一个与LIBCMT.LIB链接的程序中调用C Runtime函数,则必须要用_beginthreadex启动线程
7._beginthreadex启动的线程可以安全的调用任何C Runtime 函数
本文只是做了下区别,使用方法还是到MSDN上一查就出来了,非常简单,多谢查阅。