2012-11-27 30 views
7

我想知道當我從freebsd的port源碼編譯perl 5.16(和其他版本)時,選項'THREADS'和'PTHREAD'之間有什麼不同?perl中的線程與pthread的對比

PTHREAD是否是posix-threading? (因爲-pthread)如果是這樣,它是首選'THREADS'? (因爲它似乎被預先選定)甚至在freebsd上?另一方面,'THREADS'(內核線程)是什麼?優缺點都有什麼?

我可以在一次安裝中使用兩者嗎?它有意義嗎?

據我所知,沒有多少東西可以與perl結合使用。

非常感謝 吉米

+0

哼... Perl只有一個線程模型('-Dusethreads') – ikegami

+0

hmm :)確定使用'THREADS'編譯它會將配置參數從-Dusethreads = n更改爲-Dusethreads = y。 'PTHREADS'爲ldflags添加'-pthread'。所以,我猜這不只是在開玩笑。它有所不同,但我想知道什麼?! :/ –

+1

Perl曾經有一個不同的線程模型。它非常破碎。你可能試圖訪問它。 – ikegami

回答

17

使用線程的是,正如其他人所描述,當然它。

與pthread的鏈接意味着您的perl是使用-pthread標誌構建的。這有一個微妙但重要的影響。這意味着當perl啓動時,維護線程狀態的libc數據被初始化。這意味着如果您的perl在線程庫上調用dlopen(),它將正常工作,而不是掛起。

PS。我實際上是寫了PTHREAD選項並提交給該港口的人。我實際上發現了一些perl模塊,其中dlopen()有一些線程庫,並導致perl掛起。花了一段時間找出原因。相信我,你想要PTHREAD選項。我其實正在考慮刪除關閉它的選項。有關更多信息,請參見FreeBSD PR 163512和163878.我們可能應該在上游推送此選項,以便perl在FreeBSD上默認使用此選項。任何可能調用dlopen()的東西都應該使用-pthread來構建。

+0

我只是愛你!是的,關於你提到和引用的內容,這聽起來像是一個好主意,它只是默認。再次感謝! –

+0

謝謝你的解釋。我建議始終將perl與pthreads鏈接起來:https://rt.perl.org/Public/Bug/Display.html?id = 122906 –