На основе класса scoped_thread, определенного в C++ Конкуренция в действии усиливается. Thread определяет класс обертки резьбы, который вместо вызова завершается, если поток присоединяется к разрушению, вызовите определенное действие, заданное в качестве параметра шаблона.
При этом класс scoped_thread определен в C++ Concurrency in Action ближе к классу strict_scoped_thread, который не допускает никаких изменений в обернутой нити. Thread предоставляет класс scoped_thread, который обеспечивает такой же непревзойденный интерфейс, как thread.
Скорпион Нити - это обертки вокруг нити, которые позволяют пользователю указывать, что делать во время разрушения. Одним из распространенных применений является присоединение к потоку во время разрушения, поэтому это поведение по умолчанию. Это единственное различие в отношении нити. В то время как поток вызывает std::terminate() на деструкторе, если поток является соединительным, strict_scoped_thread<> или scoped_thread<> присоединитесь к потоку, если присоединяемый.
Разница между strict_scoped_thread и scoped_thread заключается в том, что strict_scoped_thread полностью скрывает принадлежащую нить, и поэтому пользователь не может делать ничего с принадлежащей нитью, кроме конкретного действия, заданного в качестве параметра, в то время как scoped_thread обеспечивает тот же интерфейс, что и thread и пересылает все операции.
Ничто: Кабельная нить ()(t_) не должна выбрасываться при присоединении к потоку, поскольку заданная переменная находится на области за пределами функции потока.
#include<boost/thread/scoped_thread.hpp>template<classCallableThread>classscoped_thread{threadt_;// for exposition purposes onlypublic:scoped_thread()noexcept;scoped_thread(constscoped_thread&)=delete;scoped_thread&operator=(constscoped_thread&)=delete;explicitscoped_thread(thread&&th)noexcept;template<typenameF&&,typename...Args>explicitscoped_thread(F&&,Args&&...);~scoped_thread();// move supportscoped_thread(scoped_thread&&x)noexcept;scoped_thread&operator=(scoped_thread&&x)noexcept;voidswap(scoped_thread&x)noexcept;typedefthread::idid;idget_id()constnoexcept;booljoinable()constnoexcept;voidjoin();#ifdefBOOST_THREAD_USES_CHRONOtemplate<classRep,classPeriod>booltry_join_for(constchrono::duration<Rep,Period>&rel_time);template<classClock,classDuration>booltry_join_until(constchrono::time_point<Clock,Duration>&t);#endifvoiddetach();staticunsignedhardware_concurrency()noexcept;staticunsignedphysical_concurrency()noexcept;typedefthread::native_handle_typenative_handle_type;native_handle_typenative_handle();#ifdefinedBOOST_THREAD_PROVIDES_INTERRUPTIONSvoidinterrupt();boolinterruption_requested()constnoexcept;#endif};voidswap(scoped_thread&lhs,scoped_thread&rhs)noexcept;
RAII thread обертка с добавлением конкретного эсминца, позволяющего освоить то, что можно сделать во время разрушения.
CallableThread: Скриншоты из игры Thread&. По умолчанию: join_if_joinable.
Thread destructor завершает программу, если резьба соединена. Эту обертку можно использовать для соединения нити перед ее разрушением.
Примечание: scoped_thread не является thread, поскольку thread не предназначен для получения из полиморфного типа.
В любом случае scoped_thread может использоваться в большинстве контекстов a thread может использоваться, поскольку он имеет тот же неустановленный интерфейс, за исключением конструкции.
Переносит право собственности на объемную _потоку, управляемую другими (если таковые имеются), на *это после вызова Кабельная струна()(t_).
Postconditions:
other->get_id::id() и get_id() возвращает значение other.get_id() до назначения.
Throws:
Ничто: Кабельная нить ()(t_) не должна выбрасываться при присоединении к потоку, поскольку заданная переменная находится на области за пределами функции потока.
Ничто: Кабельная нить ()(t_) не должна выбрасываться при присоединении к потоку, поскольку заданная переменная находится на области за пределами функции потока.
Статья Scoped Threads раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 35. Thread 4.7.1 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.