在多线程编程领域里面,要建立一个线程,我们有很多的选择,例如
1,win32的CreateThread(),
2,_beginthread()
3,_beginthreadex(),
4,还有MFC程序里面的CWinThread::CreateThread()
5,AfxBeginThread()
但是事情并不总是想我们希望的那样美好,这些函数的使用某种程度上都有各自的使用范围,下面我就这一点谈谈自己的看法。
Win32的CreateThread()函数是windows提供给我们建立线程的一种方法,如果你的线程中没有使用C Run time Library(CRL),而只有win32 API函数,那么你使用这个函数来建立线程是安全的。但是如果你的线程中使用的C Run Time Library,而且你用到函数在CRL中具有如下的性质,那么你再使用win32的CreateThread函数建立线程就有点不安全了。这些性质包括:
这是为什么呢?CRL有单线程和多线程两个版本,单线程Library如果被链接到多线程程序中,那么很多全局,静态变量就会由于多个线程的访问而产生冲突,例如一个全局变量被线程1修改之后,线程2再去访问的时候,由于不知道已经被修改,而引用了错误的数据。所以在多线程程序中我们要链接多线程的CRL才不会发生这样的事情,因为多线程版本的CRL引入了线程安全机制。
但是为什么win32的CreateThread()函数建立的多线程程序中链接CRL的多线程版本仍然不安全呢?因为多线程版本的CRL需要一些簿记工作,来为每一个线程保存一份变量,而win32的CreateThread()函数不具备簿记的功能,所以也就变的不安全了。
_beginthread()函数是一个不很完善的函数有很多的问题,我们最好不要使用这个函数来建立线程。
_beginthreadex()函数相对上面的函数来说就提供了更多的功能,在建立多线程程序的时候,我们链接CRL的多线程版本,并且使用_beginthreadex()函数建立线程,由于_beginthreadex()函数的内部调用了CreateThread()函数所以需要closehandle来关闭线程句柄,_beginthreadex()函数他具有簿记功能,这样多线程版本的CRL就可以知道要为每个线程保存一份变量了。
MFC程序中的AfxBeginThread()函数的内部调用了CWinThread::CreateThread()函数,而CWinTrhead::CreateThread()函数有调用了_beginthreadex()函数。
在MFC多线程程序中,我们不用_beginthreadex()和win32的CreateThread()来建立线程。而书中曾经警告说
Use AfxBeginThread to create a thread object and execute it in one step.【AfxBeginThread函数可以创建线程并且开始执行这是一步就完成的】 Use CreateThread if you want to reuse the thread object between successive creation and termination of thread executions.【如果你想在接下来的线程创建和结束的整个过程中重新使用线程对象,那么就可以使用CreateThread成员函数】