2013-09-25 82 views
1

我從Delphi中的TThread派生了一個TMyThread對象,而在TMyThread.Execute中,它將調用由Visual C++編寫的DLL。在這種情況下,該DLL是否也要與多線程庫一起編譯並支持多線程?當被Delphi對象調用時,一個DLL是否必須是多線程的?

+0

不是,如果你只打算在這一個線程上調用它。是的,如果你打算創建幾個線程並同時調用它們的DLL。 –

+0

如果涉及COM,請不要忘記CoInitialize。 –

回答

1

較舊版本的MSVC運行時包含多線程和單線程變體。不同的是,單線程變體不能防止潛在的競爭條件。因此,如果調用MSVC運行時的代碼是通過多個線程執行的,則單線程運行時無法安全使用。

您描述的場景只有一個線程在您的MSVC DLL中執行代碼。在這種情況下,單線程MSVC運行時可以安全使用。主機可執行文件是多線程的並不重要。重要的是多線程是否調用連接到MSVC DLL的MSVC運行時。

MSVC在許多版本之前停止發佈單獨的單線程和多線程運行時。有人想知道它是否對你的應用產生影響。您能檢測到兩個運行時選項之間的任何性能差異嗎?如果沒有,那麼使用多線程運行時對我來說是有意義的。選擇單線程運行時只是在未來對代碼進行更改時忘記了這一點,並將額外的線程引入到MSVC DLL中,從而存儲潛在的調試頭痛。

0

如果您打算使用MT,C++ DLL應該是MT。如果您打算僅從您的應用程序的單個線程使用它,那麼您不必那樣做。但是,只要有絲毫懷疑可能存在線程衝突的情況,您應該清楚地記錄這一點。在DLL內部管理數據結構。或者使用MT,注意正確的鎖定並忘記它。 (我以前的德爾福聲明仍然是正確的)。

+0

我不知道這是如何回答問題。問題是關於MSVC DLL是否需要多線程感知。任何發佈爲答案的東西都應該回答這個問題。你發佈的內容是一條評論,應該作爲原始問題發佈。 SO不是論壇或新聞組。 :-) –

+0

Ehm - 正確。我讀/明顯回答太快。肯,謝謝你的提示。 =>完成。 – JensG

相關問題