在OS X上增强光纤

时间:2015-06-02 00:05:15

标签: macos c++14 boost-thread lld

我正在尝试在os x上运行增强光纤,并且我遇到了很多问题。首先,光纤不能用Apple clang编译,因为使用了thread_local Apple不支持(根据我在网上发现的,他们认为他们可以比标准llvm更好地实现它而不想介绍它只会在以后打破ABI。)

相反,我尝试使用通过自制软件安装的gcc-5。在使用boost构建进行了一些调整之后,我设法建立了光纤,并且我可以成功地链接示例程序,但它们会出错。

然后我想我会尝试使用当前的llvm,因为它有thread_local支持,我可以再次获得boost光纤来构建,但现在我遇到了问题,因为os x链接器似乎没有处理线程本地正确!我会发布确切的错误,但我的力量已经消失。实际上我确实通过对光纤进行了一些更改来实现链接,但示例程序再次失败。

所以问题是,我怎样才能实现这一目标?有没有办法让另一个链接器为我生成os x可执行文件? Llvm附带了另一个名为lld的链接器,但我不认为它能够实现我所追求的目标。

我想如果我绝对必须,我可以通过光纤和提升上下文用boost :: thread_specific_ptr替换所有thread_local,但我不确定兔子洞的深度。有什么建议?

1 个答案:

答案 0 :(得分:0)

我也在实现类似boost上下文的功能,并且遇到了线程局部问题。由于OSX上的clang并不真正支持thread_local关键字,因此我通过自己的“thread_local_ptr”进行解决。

使用std::thread来实现这一点并不困难,这是由clang很好地实现的。基本的想法是,只要你想获得一个线程本地对象,使用像thread_local_ptr<SomeType> some_obj_ptr;之类的语句,你可以首先获得带有std::this_thread::get_id的线程id,如果你可以实现它,它可以识别一个特定于线程的对象池,然后您可以检查该对象池中是否有SomeType的任何对象。就是这样。

您可能想看看我的scope_local指针的实现: https://github.com/ljsnogard/freebird/blob/f4e2c195ead63b543aaaccbef6920ce72043f08a/Freebird/freebird.hpp从第311行开始