線程對於初學者還說可能覺得很高深,這可以理解。對於某些有經驗的程式員來說,可能覺得又太簡單,我覺得如果認為線程很簡單的人,都是沒有理解線程,線程裡面涉及的東西太多,包括記憶體,初始化,線程同步等。我打算以QA的形式來寫這篇文章。
Q:為什麼書上說要以_beginthreadex來替代CreateThread?
A:好了,一直用API CreateThread來建立線程的同志們要注意了,你可能會說我一直用這個API來建立線程,工作剛剛的,一點問題都沒有。如果真是這樣的話,我只能說是你運氣太好了。在_beginthreadex的內部,它調用了CreateThread來建立線程,Windows始終用CreateThread來建立線程。在調用CreateThread之前,beginthreadex它做了很多初始化的工作,所以它比CreateThread建立的線程更加安全。
Q:為什麼要用兩個相同功能的函數來對待單線程和多線程式程式呢?
A:這裡就有一定的曆史原因了,標準C語言的庫在是1970年左右發明的,而在那時候,線程的概念尚未出現在任何一個作業系統上。但是,線程畢竟是出現了,讓我們來看看下面這個例子,來說明以前的CRT為什麼不支援多線程:
BOOL fFailure = (system("NOTEPAD.EXE README.TXT") == -1); if (fFailure) { switch (errno) { case E2BIG: // Argument list or environment too big break; case ENOENT: // Command interpreter cannot be found break; case ENOEXEC: // Command interpreter has bad format break; case ENOMEM: // Insufficient memory to run command break;