亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可以在多線程 DLL 的接口函數中創建線程嗎?

可以在多線程 DLL 的接口函數中創建線程嗎?

守候你守候我 2019-02-20 19:15:38
我把自己寫的一些函數做成了支持多線程的DLL?,F在有一個需求:調用 DLL 的 A 函數時,需要在 A 中創建一個工作者線程。線程創建函數 thread_create(thread_t *th,void *(*start)(void*),void *arg) 調用_beginthreadex 創建線程。不知能否這樣做???現在的情況是,當其他應用程序調用這個 DLL時,就說:無法解析的外部符號 _thread_create,該符號在函數 A 中被引用(IDE:VS2005)謝謝,忘了說了,我的是 C 的程序,發到C#這兒了,不好意思。我沒有在 DLLMain 中創建線程,而是其他導出函數。在幫我分析下?呵呵A 函數的實現沒有寫到C文件中。thread_create 是DLL 的內部函數,不是導出函數,不需要導出吧。
查看完整描述

4 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

共享一份DLL
-------------
原因涉及DLL加載和運行機制,主要有兩點:
1)DLL動態鏈接庫無法獨立運行,必須由一個應用程序進程加載到進程空間后才能使用。加載DLL的進程稱為宿主進程。被加載的DLL屬于宿主進程,不屬于宿主進程內某個線程。
2)宿主進程可以重復調用,甚至重復加載DLL。第1次調用DLL或第1次加載DLL時,宿主進程將DLL引入進程空間。一旦宿主進程成功加載DLL,隨后的重復調用或重復加載只會增加“引用計數”,而不會加載多份DLL,所以進程中只有一份DLL。

查看完整回答
反對 回復 2019-03-26
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

C#本身就能支持線程,為什么還要多此一舉的去調用DLL創建線程了.
印象中微軟說過不要再DllMain中創建線程,否則會死的很慘.可以查閱MSDN.
不過導出函數中應該是可以創建線程的...應該是你的代碼寫滴不對,不過沒必要舍近求遠吧

查看完整回答
反對 回復 2019-03-26
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

應該是你的A函數的實現寫在頭文件里了。A里面調用了thread_create,但是thread_create的實現沒有從dll里export出來,所以就出這個錯。
解決辦法:把A函數的實現寫到C文件里,頭文件里只包含一個聲明就夠了。 記得導出A函數。。。

thread_create不需要導出。一個原則:只要你的客戶端(就是調用DLL的程序)代碼能看見thread_create,肯定就會有問題。你只要把A函數放到dll代碼的C文件里,頭文件里只留個聲明,這樣客戶端就看不到thread_create,也就不會出現剛才那個錯誤。

查看完整回答
反對 回復 2019-03-26
  • 4 回答
  • 0 關注
  • 1786 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號