C++11 позволяет удалять некоторые неявно сгенерированные функции в качестве конструкторов и присваивания с использованием «=удалить», как в описании.
public:thread(threadconst&)=delete;
На компиляторах, не поддерживающих эту функцию, Boost. Проток реле на частичной симуляции, он объявляет функцию частной без определения.
private:thread(thread&);
Эмуляция является частичной, поскольку приватная функция может использоваться для разрешения перегрузки для некоторых компиляторов и предпочитает ее другим перегрузкам, которые нуждаются в преобразовании. Смотрите ниже последствия на ходу семантической эмуляции.
Для того, чтобы реализовать Переменные классы, переместить параметры и вернуть типы Boost. Thread использует ссылку rvalue, когда компилятор поддерживает ее. На компиляторах не поддерживающих его Boost. Thread использует эмуляцию, предоставленную Boost. Перемещение или эмуляция, предоставленная предыдущими версиями Boost. В зависимости от того, будет ли<BOOST_THREAD_USES_MOVE>определено или нет. Этот макрос не устанавливается по умолчанию, когда<BOOST_THREAD_VERSION>равно 2. С тех пор<BOOST_THREAD_VERSION>3,<BOOST_THREAD_USES_MOVE>определено.
До версии 1.50, буст. Трэд использует собственную семантическую эмуляцию движения, которая имела больше ограничений, чем Boost. Пошли. Кроме того, это представляет интерес для всего сообщества Boost. Thread использует Boost. Двигайтесь так, чтобы усилитель::thread мог храниться в движимых контейнерах.
Чтобы сохранить обратную совместимость хотя бы во время некоторых релизов, Boost. Thread позволяет пользователю использовать устаревшую семантическую эмуляцию движения, определяющую BOOST_THREAD_DONT_USE_MOVE.
Многие аспекты семантики перемещения могут быть эмулированы для компиляторов, не поддерживающих ссылки на rvalue и Boost. Thread Heritage предлагает инструменты для этой цели.
Чтобы сделать библиотечный код портативным Boost. Thread использует некоторые макросы, которые будут использовать либо те, которые предоставляются Boost. Перемещайте или устаревшую семантику движения, предоставленную предыдущими версиями Boost. Нить.
Посмотрите на рост. Переместить документацию для полного описания того, как декларировать новые движимые классы и его ограничения.
Кроме того, для переноса кода необходимы следующие макросы:
<BOOST_THREAD_RV(V)>макрос для доступа к значению r из BOOST_THREAD_RV_REF(TYPE),
<BOOST_THREAD_MAKE_RV_REF(RVALUE)>Для того, чтобы получить значение.
<BOOST_THREAD_DCL_MOVABLE(CLASS)>Чтобы избежать конфликтов с Бутом. Двигаться
<BOOST_THREAD_DCL_MOVABLE_BEG(T1)>и<BOOST_THREAD_DCL_MOVABLE_END>являются вариантом<BOOST_THREAD_DCL_MOVABLE>, когда параметр представляет собой инстанциацию шаблона.
Другие макросы предоставляются и должны быть включены в общедоступный раздел:
<BOOST_THREAD_NO_COPYABLE>объявляет класс некопируемым, либо удаляя конструкторы копий и присваивая копии, либо перемещая их в частный раздел.
<BOOST_THREAD_MOVABLE(CLASS)>объявляет все неявные конверсии ссылкой на значение r.
Этот макрос обозначает тип как подвижный, но не копируемый, отключающий конструкцию и назначение копии. Пользователю нужно будет написать конструктор/назначение движения, чтобы полностью написать подвижный, но не копируемый класс.
Этот макрос обозначает тип как копируемый и подвижный. Пользователю необходимо будет написать конструктор/назначение движения и задание на копирование, чтобы полностью написать копируемый и подвижный класс.
Этот макрос используется для достижения портативного синтаксиса в движущихся конструкторах и назначениях для классов, помеченных как<BOOST_THREAD_COPYABLE_AND_MOVABLE>или<BOOST_THREAD_MOVABLE_ONLY>.
<BOOST_THREAD_RV_REF_BEG>и<BOOST_THREAD_RV_REF_END>используются, когда параметр заканчивается<>>, чтобы избежать ошибки компилятора.
Пока буст. Эмуляция перемещения позволяет получить доступ к ссылке rvalue<BOOST_THREAD_RV_REF(TYPE)>с помощью оператора точек, наследие определяет<operator->>. Нам нужен макрос<BOOST_THREAD_RV>, который маскирует эту разницу. Например.
Пока буст. Move - лучшая эмуляция C++03, есть некоторые ограничения, которые влияют на способ использования библиотеки. Например, со следующими заявлениями
Это не может работать на некоторых компиляторах, даже если поток конвертируется в<rv<thread>>, потому что компилятор предпочитает частный конструктор копий.
threadmkth(){returnthread(f);}
На этих компиляторах мы должны использовать явное преобразование. Библиотека предоставляет функцию члена движения, которая позволяет обойти проблему.
threadmkth(){returnthread(f).move();}
Обратите внимание, что<::boost::move>не может использоваться в этом случае, поскольку поток не является неявно конвертируемым в<thread&>.
threadmkth(){return::boost::move(thread(f));}
Чтобы сделать код портативным Boost. Поток должен использовать макрос<BOOST_THREAD_MAKE_RV_REF>, который может быть использован как в
Если<owns_lock()>возвращает<true>, значение, которое оценивает до<true>в булевых контекстах, в противном случае значение, которое оценивает до<false>в булевых контекстах.
Эти макросы позволяют использовать «future_errc» почти во всех случаях в качестве объемного перечня.
Однако есть некоторые ограничения:
Тип не является C++ enum, поэтому 'is_enum' будет false_type.
Эмулированный объемный список не может быть использован ни в переключателе, ни в шаблонных аргументах. Для этого пользователю необходимо использовать макросы.
Статья Emulations раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 35. Thread 4.7.1 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.