Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Emulations

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 35. Thread 4.7.1

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

C++11 позволяет удалять некоторые неявно сгенерированные функции в качестве конструкторов и присваивания с использованием «=удалить», как в описании.

public:
  thread(thread const&) = 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 предлагает инструменты для этой цели.

Далее следует интерфейс унаследованного движения семантического помощника класса и функции.

namespace boost
{
  namespace detail
  {
      template<typename T>
      struct thread_move_t
      {
        explicit thread_move_t(T& t_);
        T& operator*() const;
        T* operator->() const;
      private:
        void operator=(thread_move_t&);
      };
  }
  template<typename T>
  boost::detail::thread_move_t<T> move(boost::detail::thread_move_t<T> t);
}

Написать класс MovableOny можно следующим образом. Вам просто нужно следовать этим простым шагам:

  • Добавить конверсию в<detail::thread_move_t<classname>>
  • Сделайте конструктор копий частным.
  • Напишите конструктору, взяв параметр<detail::thread_move_t<classname>>
  • Напишите задание с параметром<detail::thread_move_t<classname>>

Например, класс потоков определяет следующее:

class thread
{
  // ...
private:
    thread(thread&);
    thread& operator=(thread&);
public:
    detail::thread_move_t<thread> move()
    {
        detail::thread_move_t<thread> x(*this);
        return x;
    }
    operator detail::thread_move_t<thread>()
    {
        return move();
    }
    thread(detail::thread_move_t<thread> x)
    {
        thread_info=x->thread_info;
        x->thread_info.reset();
    }
    thread& operator=(detail::thread_move_t<thread> x)
    {
        thread new_thread(x);
        swap(new_thread);
        return *this;
    }
  // ...
};

Чтобы сделать библиотечный код портативным Boost. Thread использует некоторые макросы, которые будут использовать либо те, которые предоставляются Boost. Перемещайте или устаревшую семантику движения, предоставленную предыдущими версиями Boost. Нить.

Посмотрите на рост. Переместить документацию для полного описания того, как декларировать новые движимые классы и его ограничения.

  • <BOOST_THREAD_RV_REF(TYPE)>является эквивалентом<BOOST_RV_REF(TYPE)>.
  • <BOOST_THREAD_RV_REF_BEG>является эквивалентом<BOOST_RV_REF_BEG(TYPE)>.
  • <BOOST_THREAD_RV_REF_END>является эквивалентом<BOOST_RV_REF_END(TYPE)>.
  • <BOOST_THREAD_FWD_REF(TYPE)>является эквивалентом 'BOOST_FWD_REF(TYPE)

Кроме того, для переноса кода необходимы следующие макросы:

  • <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_MOVABLE_ONLY(CLASS)>является эквивалентом<BOOST_MOVABLE_BUT_NOT_COPYABLE(CLASS)>.
  • <BOOST_THREAD_COPYABLE_AND_MOVABLE(CLASS)>является эквивалентом<BOOST_COPYABLE_AND_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>, который маскирует эту разницу. Например.

thread(BOOST_THREAD_RV_REF(thread) x)
{
    thread_info=BOOST_THREAD_RV(x).thread_info;
    BOOST_THREAD_RV(x).thread_info.reset();
}

Использование этих макросов значительно уменьшило размер Boost. Код, связанный с движением потока.

Пока буст. Move - лучшая эмуляция C++03, есть некоторые ограничения, которые влияют на способ использования библиотеки. Например, со следующими заявлениями

class thread {
  // ...
private:
  thread(thread &);
public:
  thread(rv<thread>&);
  // ...
};

Это не может работать на некоторых компиляторах, даже если поток конвертируется в<rv<thread>>, потому что компилятор предпочитает частный конструктор копий.

thread mkth()
{
  return thread(f);
}

На этих компиляторах мы должны использовать явное преобразование. Библиотека предоставляет функцию члена движения, которая позволяет обойти проблему.

thread mkth()
{
  return thread(f).move();
}

Обратите внимание, что<::boost::move>не может использоваться в этом случае, поскольку поток не является неявно конвертируемым в<thread&>.

thread mkth()
{
  return ::boost::move(thread(f));
}

Чтобы сделать код портативным Boost. Поток должен использовать макрос<BOOST_THREAD_MAKE_RV_REF>, который может быть использован как в

thread mkth()
{
  return BOOST_THREAD_MAKE_RV_REF(thread(f));
}

Обратите внимание, что это ограничение разделяется и наследием Boost. Эмуляция движения нитки.

Как Буст. Движение также определяет функцию<boost::move>, которую мы должны специализировать<has_move_emulation_enabled_aux>.

template <>
struct has_move_emulation_enabled_aux<thread>
  : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
{};

Таким образом, следующее повышение. Перемещение перегрузки отключено

template <class T>
inline typename BOOST_MOVE_BOOST_NS::disable_if<has_move_emulation_enabled_aux<T>, T&>::type move(T& x);

Для этого используются макросы<BOOST_THREAD_DCL_MOVABLE(CLASS)>,<BOOST_THREAD_DCL_MOVABLE_BEG(T1)>и<BOOST_THREAD_DCL_MOVABLE_END>. Например.

BOOST_THREAD_DCL_MOVABLE(thread)

и

BOOST_THREAD_DCL_MOVABLE_BEG(T) promise<T> BOOST_THREAD_DCL_MOVABLE_END

Замки обеспечивают явный оператор преобразования болтов, когда компилятор предоставляет их.

explicit operator bool() const;

Библиотека обеспечивает неявное преобразование в неопределенный тип, который может быть использован в качестве условного выражения.

#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
    operator unspecified-bool-type() const;
    bool operator!() const;
#else
    explicit operator bool() const;
#endif

Пользователь должен использовать lock.owns_lock(), когда требуется явное преобразование.

Returns:

Если<owns_lock()>возвращает<true>, значение, которое оценивает до<true>в булевых контекстах, в противном случае значение, которое оценивает до<false>в булевых контекстах.

Throws:

Ничего.

Returns:

<!><owns_lock()>.

Throws:

Ничего.

Некоторые из перечислений, определенных в стандартной библиотеке, являются объемными.

На компиляторах, которые их не поддерживают, библиотека использует класс для обертывания базового типа. Вместо того чтобы

enum class future_errc
{
    broken_promise,
    future_already_retrieved,
    promise_already_satisfied,
    no_state
};

Библиотека называет эти типы

BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
{
    broken_promise,
    future_already_retrieved,
    promise_already_satisfied,
    no_state
}
BOOST_SCOPED_ENUM_DECLARE_END(future_errc)

Эти макросы позволяют использовать «future_errc» почти во всех случаях в качестве объемного перечня.

Однако есть некоторые ограничения:

  • Тип не является C++ enum, поэтому 'is_enum' будет false_type.
  • Эмулированный объемный список не может быть использован ни в переключателе, ни в шаблонных аргументах. Для этого пользователю необходимо использовать макросы.

Вместо того чтобы

    switch (ev)
    {
    case future_errc::broken_promise:
// ...

использовать

switch (boost::native_value(ev))
{
case future_errc::broken_promise:

Вместо того, чтобы

#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
template <>
struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc> : public true_type { };
#endif

использовать

#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
template <>
struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc::enum_type> : public true_type { };
#endif

PrevUpHomeNext

Статья Emulations раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 35. Thread 4.7.1 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 35. Thread 4.7.1 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:55:45/0.031399965286255/1