Windows Via C/C++:線程入口點函數

線程入口點函數

  線程必須指定要執行的入口點函數,我們已經知道主線程的入口點函數是_tmain/_tWinMain。手動創建線程時,其入口點函數格式如下:

  線程入口點函數可以執行你指定的任何操作。線程在入口點函數返回時停止運行,系統釋放線程棧,並將線程內核對象引用計數減1,如果引用計數變爲0,系統會銷燬線程內核對象。和進程內核對象類似,線程內核對象的生存期可能要比線程本身的生存期更長。

  下面是線程入口點函數需要注意的一些地方:

  • 主線程入口點函數必須命名爲main/wmain/WinMain/wWinMain(如果要使用別的入口點函數,可以在工程屬性的“鏈接器”中將/ENTRY選項設置爲相應的函數名),而手動創建的線程入口點函數的命名是任意的,只要符合C/C++語言標識符規範既可
  • 線程入口點函數的參數是void指針,這意味着你可以向其傳遞任何自定義的參數
  • 線程入口點函數必須返回一個值,返回值將作爲線程的退出碼
  • 線程入口點函數應該儘量使用函數參數和非靜態局部變量。當你在線程函數內使用靜態和全局變量時,可能會引發多線程讀寫數據衝突的問題,由於參數和局部變量是在線程棧上創建的,在不同線程之間是獨立的,因而不用擔心讀寫衝突

 

  你已經知道如何定義線程入口點函數了,接下來我們會討論操作系統如何創建線程並執行線程入口點函數。


附註

  使用VC編譯器時,IDE默認將應用的入口點函數設置爲CRT啓動函數(mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup),在VS工程屬性的“鏈接器”選項卡中,你可以將入口點/ENTRY設置爲任何自定義的函數,但這樣做是危險的,CRT啓動函數負責初始化CRT的一切資源,如果不執行CRT啓動函數,你的代碼也就不應該試圖訪問任何CRT變量/函數等等。舉個最簡單的例子:
新建一個windows console空項目,添加上面的代碼,此時程序的默認入口點函數是mainCRTStartup。在main的返回語句前設置斷點,調試並觀察argc和argv的值,分別是1和應用的啓動路徑。接下來將工程的/ENTRY選項設置爲main,再次調試,這時你會發現argc和argv的值都變爲無效。這也符合MSDN對/ENTRY的闡述“建議讓鏈接器設置入口點,以便 C 運行時庫正確初始化,並執行靜態對象的 C++ 構造函數”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章