CreateThread,_beginthread,_beginthreadx的區別

來源:互聯網
上載者:User

首先要澄清一個問題,那就是CreateThread是Windows的API函數,而_beginthread和_beginthreadex則是CRT庫函數,查看這兩個CRT函數的代碼可以得知其實它們內部是調用的CreateThread(這很顯然嘛,CRT庫也是要運行在Windows上)。

這兩個CRT函數與CreateThread有什麼區別呢?區別在於這兩個CRT函數針對其它CRT庫函數,特別是那些涉及記憶體配置的CRT函數做了特殊的處理。直接在CreateThread API建立的線程中使用sprintf,malloc,strcat等涉及CRT儲存堆操作的CRT庫函數是很危險的,容易造成線程的意外中止。 在使用_beginthread和_beginthreadex建立的線程中可以安全的使用CRT函數,但是必須線上程結束的時候相應的調用_endthread或_endthreadex。雖然都是內部調用CreateThread API建立線程,但是這兩個函數還是有很大的區別。首先,_beginthreadex函數比_beginthread函數多了三個參數,使它看起來更像CreateThread而不是同胞兄弟_beginthread;其次,_beginthread要求線程函數是__cdecl呼叫慣例,並且沒有傳回值,而_beginthreadex則要求線程函數是__stdcall呼叫慣例並且返回線程的退出碼;第三,與_beginthread成對調用的_endthread函數內部隱式的調用CloseHandle關閉了線程控制代碼,而與_beginthreadex成對使用的_endthreadex則沒有關閉線程的控制代碼,需要顯示的調用CloseHandle關閉線程控制代碼;最後,這兩個函數在執行成功時返回線程的控制代碼,可以通過這個控制代碼調用其它線程相關的API,比如SetThreadPriority,ResumeThread等等。但是執行失敗時傳回值是不同的,_beginthread返回 -1 表示失敗,而_beginthreadex返回 0 表示失敗。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.