我從Delphi中的TThread派生了一個TMyThread對象,而在TMyThread.Execute中,它將調用由Visual C++編寫的DLL。在這種情況下,該DLL是否也要與多線程庫一起編譯並支持多線程?當被Delphi對象調用時,一個DLL是否必須是多線程的?
回答
較舊版本的MSVC運行時包含多線程和單線程變體。不同的是,單線程變體不能防止潛在的競爭條件。因此,如果調用MSVC運行時的代碼是通過多個線程執行的,則單線程運行時無法安全使用。
您描述的場景只有一個線程在您的MSVC DLL中執行代碼。在這種情況下,單線程MSVC運行時可以安全使用。主機可執行文件是多線程的並不重要。重要的是多線程是否調用連接到MSVC DLL的MSVC運行時。
MSVC在許多版本之前停止發佈單獨的單線程和多線程運行時。有人想知道它是否對你的應用產生影響。您能檢測到兩個運行時選項之間的任何性能差異嗎?如果沒有,那麼使用多線程運行時對我來說是有意義的。選擇單線程運行時只是在未來對代碼進行更改時忘記了這一點,並將額外的線程引入到MSVC DLL中,從而存儲潛在的調試頭痛。
如果您打算使用MT,C++ DLL應該是MT。如果您打算僅從您的應用程序的單個線程使用它,那麼您不必那樣做。但是,只要有絲毫懷疑可能存在線程衝突的情況,您應該清楚地記錄這一點。在DLL內部管理數據結構。或者使用MT,注意正確的鎖定並忘記它。 (我以前的德爾福聲明仍然是正確的)。
我不知道這是如何回答問題。問題是關於MSVC DLL是否需要多線程感知。任何發佈爲答案的東西都應該回答這個問題。你發佈的內容是一條評論,應該作爲原始問題發佈。 SO不是論壇或新聞組。 :-) –
Ehm - 正確。我讀/明顯回答太快。肯,謝謝你的提示。 =>完成。 – JensG
- 1. 當試圖從另一個窗口訪問一個對象時,「調用線程必須是STA」錯誤
- 2. 確定一個對象是否被多個線程訪問?
- 3. ExcelDna:Async:調用線程必須是STA
- 4. 調用線程必須是STA
- 5. 調用線程必須是STA錯誤
- 6. RichTextBox - InvalidOperationException:調用線程必須是STA
- 7. 多個定時器WPF應用程序,調用線程必須是STA錯誤
- 8. 「invocables」必須是一個對象
- 9. queryselector必須是一個對象mongodb
- 10. 多線程時,我是否必須鎖定數據庫連接?
- 11. 如何創建一個必須調用每次阻塞的DLL的多線程應用程序被稱爲
- 12. 是否必須在主線程上調用UIView的-drawRect?
- 13. 我是否必須配置SQLiteCommand對象?
- 14. OpenFileDialoug當前線程在OLE調用之前必須是STA
- 15. 當Z3_ast對象被刪除時是否有可用的回調?
- 16. 對象只被多個線程讀取,是否需要同步
- 17. 確定一個dll是否被應用程序中的多個線程調用 - 使用ThreadId?
- 18. 當我調用addEventListener時,是否必須設置removeEventListener?
- 19. 當子類化threading.Thread時,是否必須調用super.join()?
- 20. 對xmlhttprequest調用的響應是否必須是XML?
- 21. Delphi COM對象多線程
- 22. 添加活動時的對象鍵是否必須是唯一的?
- 23. 如何測試一個對象是否在Delphi中被釋放
- 24. 創建矩形時,調用線程必須是STA
- 25. wpf線程,線程必須是STA
- 26. 當使用 - >和「必須是類類型」時,給出「必須是類指針類型」的對象使用
- 27. 是否可以確定一個對象是否被另一個對象引用?
- 28. FormsAuthenticationTicket.Name是否必須是唯一的?
- 29. 必須是一個或多個「getSupportActionBar()setDisplayOptions ......」
- 30. MetaSerialisable對象參數後,**必須是一個映射,不是Unicode
不是,如果你只打算在這一個線程上調用它。是的,如果你打算創建幾個線程並同時調用它們的DLL。 –
如果涉及COM,請不要忘記CoInitialize。 –