Boost Fibre на OS X
Я пытаюсь заставить работать надстройку и работать на OS X, и у меня довольно много проблем. Во-первых, волокно не будет компилироваться с Apple Clang из-за использования thread_local
который Apple не поддерживает (в соответствии с тем, что я нашел в Интернете, они думают, что могут реализовать его лучше, чем стандартная версия llvm, и не хотят вводить его только для того, чтобы позже сломать ABI).
Поэтому вместо этого я попытался использовать gcc-5, установленный через homebrew. После небольшого переворота с надстройкой Boost мне удалось создать оптоволокно, и я могу успешно связать примеры программ, но они вызывают ошибку.
Тогда я решил попробовать текущую llvm, так как она имеет поддержку thread_local, и я снова могу получить boost fiber для хорошей сборки, но теперь у меня возникают проблемы, потому что компоновщик os x, похоже, не обрабатывает локально поток правильно или! Я бы опубликовал точную ошибку, но моя сила отсутствует. Я действительно заставил это связать хотя с парой изменений в волокне, но программа примера снова потерпела неудачу.
Итак, вопрос в том, как я могу это сделать? Есть ли способ заставить работать другой компоновщик для создания исполняемых файлов os x для меня? Llvm поставляется с другим компоновщиком по имени lld, но я не думаю, что он делает то, что мне нужно.
Я думаю, что если бы мне было абсолютно необходимо, я мог бы пройти через волокно и повысить контекст, заменив весь thread_local на boost::thread_specific_ptr, но я не уверен, насколько глубока эта кроличья нора. Какие-либо предложения?
1 ответ
Я также реализую что-то вроде повышения контекста и столкнулся с локальной проблемой потока, как у вас. Так как 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