因此,我有一個使用C++編寫的多線程應用程序,整個應用程序使用異步事件處理模型實現。線程所調用的函數是基於一個id(數組索引),它的函數指針存儲在索引的一個數組中(具有id的值),即,如果我將具有id 45的事件插入事件隊列,其中一個線程選擇事件並調用其索引存儲在索引45處的函數。現在,其中一些函數位於dll/shared對象內,可以隨時通過來自不同id的事件來卸載這些函數。發生這種情況時,將調用FreeLibrary(或等效)。這導致應用程序崩潰,我相信這是因爲線程仍然在dll中執行函數。所以我的問題是,有沒有什麼辦法可以安全地卸載dll,而不必擔心線程仍然在dll中執行代碼,或者有沒有辦法檢查多少個線程仍在執行dll內的代碼?在多線程應用程序中安全地卸載DLL /共享對象
0
A
回答
1
您可能有一個對象,它在構造函數中加載庫,將其卸載到析構函數中,併爲庫中的每個符號使用非靜態成員函數包裝。那麼該對象的生命週期將是庫的生命週期。
現在您的問題已減少到管理多線程程序中的對象。可能shared_ptr
將適合您的需求。也許你已經有了另一個共享對象,所以你可以簡單地將庫包裝器作爲數據成員放入該對象中。
+0
這和@sbabbi的評論看起來非常相似。但是,雖然這可能會在一個非常好的面向對象的包裝器中解決問題,但它看起來並不能解決整個問題,但我仍然可能會遇到可能會破壞系統的競爭條件。如果我錯了,請讓我知道。 – Shehzan
+0
這個想法實際上並不是很針對對象。它依賴於RAII和通用C++對象生存期規則。當然,你總是可以犯錯誤並在你的程序中進行比賽。但另一方面,這是可以做到的。像'shared_ptr'這樣的工具可以幫助正確管理多線程程序中的共享對象,無論這些對象是什麼以及它們擁有哪種資源。 –
相關問題
- 1. 在多線程應用程序中使用非線程安全的DLL
- 2. Java多線程程序:多線程中的對象共享
- 3. 大對象數組在多個線程之間共享。線程安全技術
- 4. 存儲在共享指針中的對象的線程安全
- 5. 安全地共享一個結構在多個線程
- 6. 共享對象和線程
- 7. 如何在web應用程序中最好地共享c#dll?
- 8. 應用程序對象不會共享
- 9. CURL在多線程應用程序中共享接口和cookie
- 10. 線程安全共享對象到期和重新初始化
- 11. 線程安全訪問對象之間共享的數據
- 12. 線程安全應用程序中的線程安全
- 13. 應調用公共共享函數爲線程安全鎖定
- 14. 安裝或卸載程序集的DLL
- 15. IIS 6.0應用程序池共享DLL
- 16. 使用共享對象中的應用程序的對象
- 17. Interop.Domino dll線程安全嗎?
- 18. 線程安全地更新共享對象而不會影響性能?
- 19. 共享對象和多線程問題。我應該在乎嗎?
- 20. 管理多線程應用程序中的共享變量
- 21. 共享首選項和應用程序卸載
- 22. 在線程之間共享對象
- 23. 在線程之間共享XPObject對象
- 24. 應用程序和共享會話之間的共享DLL
- 25. web應用程序中的線程安全
- 26. 有沒有辦法在多線程應用程序中安全地使用errno?
- 27. 即使在卸載安卓應用後仍保留共享對象
- 28. 從C#應用程序中的多個線程加載DLL
- 29. 在應用程序之間共享彈簧安全配置
- 30. 使用共享DLL的多個應用程序
因此,假設您確認現在沒有呼叫處於活動狀態。沒有固定的方法可以做,但假設你神奇地開發了一種方法。您驗證,卸載DLL,毫秒後,其中一個線程調用不再存在的過程。你會如何阻止? –
對DLL的句柄使用'shared_ptr'。在調用FreeLibrary之前重置shared_ptr(或者更好,FreeLibrary由shared_ptr deleter調用)。所有其他線程在使用任何DLL函數之前,都會在DLL句柄中保留一個'weak_ptr'並將其鎖定。如果鎖定失敗,則意味着DLL已被釋放。 – sbabbi
@ n.m。感謝您指出我錯過描述我的問題的極具可能性的競爭條件。這並不是說我不知道它,而是我希望有一些簡單的方法來解決它,因爲在我看來,這是使用DLL的多線程應用程序中最常見的問題。我想那不是這種情況。 – Shehzan