2015-06-02 36 views
2

我試圖在os x上啓動並運行光纖,並且遇到了很多問題。首先,由於使用了Apple不支持的thread_local,因此光纖無法與Apple clang一起編譯(根據我在網上找到的內容,他們認爲它們可以比標準的llvm更好地實現它,並且不想僅爲了突破而引入它ABI稍後)。在OS X上增強光纖

因此,我嘗試使用通過自制軟件安裝的gcc-5。經過一段時間的推動構建後,我設法構建了光纖,並且我可以成功地鏈接示例程序,但它們會造成錯誤。

然後我想我會給當前llvm一個嘗試,因爲它有thread_local的支持,我可以再次獲得提升光纖來建立罰款,但現在我得到的問題,因爲os x鏈接器似乎並沒有正確處理本地線程!我會發布確切的錯誤,但我的力量已經沒有了。雖然我對它做了一些改動,但實際上程序再次失敗了。

所以問題是,我該如何做到這一點?有沒有辦法讓另一個鏈接器爲我生成os x可執行文件? Llvm附帶了另一個名爲lld的鏈接器,但我認爲它並不符合我的要求。我想如果我絕對必須,我可以通過光纖和提升上下文替換所有thread_local與boost :: thread_specific_ptr,但我不知道兔洞有多深。有什麼建議麼?

+0

沒有代碼開始?沒有調試,回溯;沒有鏈接到[Boost Fiber](https://github.com/olk/boost-fiber)甚至?似乎你在賭別人做同樣的事情,並且對你做錯的事情有心理準備,特別是 – sehe

+0

正如我所說的,我的力量熄滅了。當我訪問我的電腦時,我會更新這個問題。在那之前我希望得到一些有用的建議...... – pat

+0

好的。很公平。 – sehe

回答

0

我也在實現類似boost的內容,並且遇到了線程本地問題。由於OSX上的叮噹聲並不真正支持thread_local關鍵字,因此我使用我自己的「thread_local_ptr」來解決問題。

這是不難實施與std::thread這是很好地實施鐺。基本的想法是,只要你想得到一個線程本地對象,像thread_local_ptr<SomeType> some_obj_ptr;這樣的語句,你可以首先獲得線程ID爲std::this_thread::get_id,它可以識別線程特定的對象池,如果你可以實現它,然後你可以檢查是否存在是該對象池中的任何對象SomeType。而已。

你可能想看看我的scope_local指針的實現: https://github.com/ljsnogard/freebird/blob/f4e2c195ead63b543aaaccbef6920ce72043f08a/Freebird/freebird.hpp從線#311