簡體   English   中英

WSACleanup和atExit

[英]WSACleanup and atExit

可以通過atExit函數注冊WSACleanup嗎? 我們有幾個應用程序可以在代碼中的不同點終止,因此我們希望避免在代碼中將WSACleanup放在任何地方。 我們可以通過DllMain調用WSAStartup / WSACleanup,因為我們有一個所有這些應用程序都使用的dll。 但是,Microsoft嚴格建議不要通過DllMain使用WSAStartup / WSACleanup,因為這會導致死鎖。 我們可以將WSAStarup移出DllMain,並在訪問Windows套接字庫之前在所有應用程序的代碼中的某一點調用它。 而且,一旦我們調用WSAStartup,我們就想使用atExit函數來注冊對WSACleanup的調用。 有沒有人有這種方法的經驗? 謝謝!

如果您有一個多線程應用程序並且某些線程仍然連接,則另一端的應用程序可能不喜歡連接終止的方式。 所以最好在main()終止之前以有序的方式關閉所有通信,當你這樣做時,你也可以調用WSACleanup。

我同意RAII方法是有利的。

然而一句警告:atExit混合了dll和句柄在Windows上被打破。 不幸的是,這會影響RAII,因為這是由c ++運行時使用atExit處理程序實現的。

在Windows上調用atexit處理程序的順序:

  1. 調用某個出口或者main()超出范圍
  2. 調用進程中定義的atexit處理程序。
  3. 所有手柄都被銷毀了。
  4. 調用dll中定義的atexit處理程序。

如果在進程中的處理程序之前注冊了dll中的atexit處理程序,則首先調用進程處理程序並在調用dll處理程序之前銷毀句柄並不重要。 當調用清理代碼時,這導致win32異常,因為dll擁有的所有句柄都不再有效。

這會影響保存線程,互斥鎖,文件,套接字等句柄的代碼。如果它們在dll中分配,則必須在調用exit之前清除它們或者根本不清除它們。

順便說一句,我不是反窗口,如果我錯了或任何人都知道任何方式,我很想知道,因為這會導致我在應用程序清理時無法忍受的痛苦。 在應用程序退出時獲取win32異常后,我認為這是在c ++運行時調試退出處理。

我不得不刪除所有退出代碼的電話。 我現在確保dll中沒有靜態數據控制句柄。 所有靜態句柄都由主要超出范圍時被破壞的對象控制。

好吧,我認為不應該使用atExit。 您應該遵循RAII原則,在類中包裝初始化和銷毀​​套接字庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM