2015-06-02 5 views
2

Я пытаюсь получить форсированное волокно и работать на os x, и у меня возникло немало проблем. Во-первых, волокно не будет компилироваться с Apple clang из-за использования thread_local, которое Apple не поддерживает (согласно тому, что я нашел в Интернете, они думают, что могут реализовать его лучше, чем стандартный llvm, и не хотят вводить его только для разрыва ABI позже).Boost Fiber на OS X

Так что вместо этого я попытался использовать gcc-5, установленный через homebrew. После небольшого закручивания с помощью boost build мне удалось собрать волокно, и я смогу связать образцы программ успешно, но они seg fault.

Тогда я решил, что дам текущую попытку 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 и столкнулся с проблемой локального потока, как и у вас. Поскольку clang на OSX действительно не поддерживает ключевое слово thread_local, я делаю работу вокруг своего собственного «thread_local_ptr».

Это не сложно реализовать с помощью std::thread, который хорошо реализуется clang. Основная идея - всякий раз, когда вы хотите получить локальный объект потока с выражением thread_local_ptr<SomeType> some_obj_ptr;, вы можете сначала получить идентификатор потока с std::this_thread::get_id, который может идентифицировать пул объектов, зависящий от потока, если вы можете его реализовать, а затем вы можете проверить, есть ли любой объект SomeType в этом пуле объектов. Вот и все.

Вы можете посмотреть на реализацию моего scope_local указателя: https://github.com/ljsnogard/freebird/blob/f4e2c195ead63b543aaaccbef6920ce72043f08a/Freebird/freebird.hpp начинаются от линии № 311

Смежные вопросы