我正在尝试在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,但我不确定兔子洞的深度。有什么建议?
答案 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行开始