2015-06-02 93 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