首頁>Club>
6
回覆列表
  • 1 # 使用者452631351002292

    CreateThread、_beginthread和_beginthreadex都是用來啟動執行緒的,但大家看到oldworm沒有提供_beginthread的方式,考試,大提示beginthread是_beginthreadex的功能子集,雖然_beginthread內部是呼叫_beginthreadex但他遮蔽了象安全特性這樣的功能,所以_beginthread與CreateThread不是同等級別,_beginthreadex和CreateThread在功能上完全可替代,我們就來比較一下_beginthreadex與CreateThread!  CRT的函式庫線上程出現之前就已經存在,所以原有的CRT不能真正支援執行緒,這導致我們在程式設計的時候有了CRT庫的選擇,在MSDN中查閱CRT的函式時都有:  Libraries  LIBC.LIB Single  thread  static  library,  retail  version  LIBCMT.LIB Multithread  static  library,  retail  version  MSVCRT.LIB  Import library  for  MSVCRT.DLL,  retail  version  這樣的提示!  對於執行緒的支援是後來的事!  這也導致了許多CRT的函式在多執行緒的情況下必須有特殊的支援,不能簡單的使用CreateThread就OK。  大多的CRT函式都可以在CreateThread執行緒中使用,看資料說只有signal()函式不可以,會導致程序終止!但可以用並不是說沒有問題!  有些CRT的函式象malloc(),  fopen(),  _open(),  strtok(),  ctime(), 或localtime()等函式需要專門的執行緒區域性儲存的資料塊,這個資料塊通常需要在建立執行緒的時候就建立,如果使用CreateThread,這個資料塊就沒有建立,然後會怎樣呢?在這樣的執行緒中還是可以使用這些函式而且沒有出錯,實際上函式發現這個資料塊的指標為空時,會自己建立一個,然後將其與執行緒聯絡在一起,這意味著如果你用CreateThread來建立執行緒,然後使用這樣的函式,會有一塊記憶體在不知不覺中建立,遺憾的是,這些函式並不將其刪除,而CreateThread和ExitThread也無法知道這件事,於是就會有Memory Leak,線上程頻繁啟動的軟體中(比如某些伺服器軟體),遲早會讓系統的記憶體資源耗盡!  _beginthreadex(內部也呼叫CreateThread)和_endthreadex就對這個記憶體塊做了處理,所以沒有問題!(不會有人故意用CreateThread建立然後用_endthreadex終止吧,而且執行緒的終止最好不要顯式的呼叫終止函式,自然退出最好!)  談到Handle的問題,_beginthread的對應函式_endthread自動的呼叫了CloseHandle,而_beginthreadex的對應函式_endthreadex則沒有,所以CloseHandle無論如何都是要呼叫的不過_endthread可以幫你執行自己不必寫,其他兩種就需要自己寫!(Jeffrey  Richter強烈推薦儘量不用顯式的終止函式,用自然退出的方式,自然退出當然就一定要自己寫CloseHandle)。

  • 中秋節和大豐收的關聯?
  • 瑟在古代是什麼樂器?