CreateThread,_beginthread,_beginthreadx的區別
https://hi.baidu.com/6%D0%C7%B9%C89/blog/item/9b95a80857cac7900b7b8203.html
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 表示失敗。
最後更新:2017-04-02 06:51:26
上一篇:
magento -- 為Magento提速再做一點小努力之移除不需要的JS
下一篇:
C 語言的謎題
《數據結構與抽象:Java語言描述(原書第4版)》一P.2.1 注釋
《數據結構與抽象:Java語言描述(原書第4版)》一P.3 Java接口
幾個C++內存泄漏和越界檢測工具簡介
Android定位功能
如何獲取客戶端IP、WEB服務器IP
[.NET 基於角色安全性驗證] 之二:ASP.NET Forms 身份驗證流程分析
Js中Prototype、__proto__、Constructor、Object、Function關係介紹總結
SpringBoot開發案例之整合日誌管理
magento -- 後台產品列表頁默認隻顯示可見性為“Catalog, Search”的產品
在 Ubuntu 16.04 上安裝和使用服務器監控報警係統 Shinken