![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Thread ManagementBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 35. Thread 4.7.1
|
![]() |
Note |
---|---|
На компиляторах, поддерживающих ссылки на rvalue,< Для других компиляторов поддержка перемещения обеспечивается слоем эмуляции перемещения, поэтому контейнеры должны явно обнаруживать этот слой эмуляции перемещения. См. |
Новый поток запускается путем передачи объекта вызывающего типа, который может быть вызван без параметров конструктору. Затем объект копируется во внутреннее хранилище и вызывается на вновь созданную нить исполнения. Если объект не должен (или не может) быть скопирован, то<boost::ref
>можно использовать для передачи ссылки на объект функции. В этом случае пользовательBoost.Threadдолжен убедиться, что объект, о котором идет речь, переживет вновь созданную нить исполнения.
struct callable { void operator()(); }; boost::thread copies_are_safe() { callable x; return boost::thread(x); } // x is destroyed, but the newly-created thread has a copy, so this is OK boost::thread oops() { callable x; return boost::thread(boost::ref(x)); } // x is destroyed, but the newly-created thread still has a reference // this leads to undefined behaviour
Если вы хотите построить экземпляр<boost::thread
>с функцией или вызывающим объектом, который требует предоставления аргументов, это можно сделать, передав дополнительные аргументы конструктору<boost::thread
>:
void find_the_question(int the_answer); boost::thread deep_thought_2(find_the_question,42);
Аргументыскопированыво внутреннюю структуру потока: если требуется ссылка, используйте<boost::ref
>, как и для ссылок на вызывающие функции.
Существует неопределенный лимит на количество дополнительных аргументов, которые могут быть приняты.
Запущенный таким образом поток создается с помощью реализации определенных атрибутов потока как размер стека, планирование, приоритет, ... или любые специфические атрибуты платформы. Непонятно, как обеспечить портативный интерфейс, позволяющий пользователю задавать платформе определенные атрибуты. Повышаю. Нить остается на средней дороге через нить класса:: атрибуты, которые позволяют установить, по крайней мере, портативным способом размер стека следующим образом:
boost::thread::attributes attrs; attrs.set_stack_size(4096*10); boost::thread deep_thought_2(attrs, find_the_question, 42);
Даже для этого простого атрибута могут быть проблемы с переносом, поскольку для некоторых платформ размер стека должен иметь минимальный размер и / или быть кратным заданному размеру страницы. Библиотека адаптирует запрашиваемый размер к ограничениям платформы, чтобы пользователю не нужно было заботиться о нем.
Это единственный атрибут, который предоставляется портативным способом. Для того чтобы установить любой другой атрибут потока во время строительства, пользователю необходимо использовать непортативный код.
На платформах PThread пользователю нужно будет получить ручку атрибутов потока и использовать ее для любого атрибута.
Далее следует, как пользователь может установить размер стека и политику планирования на платформах PThread.
boost::thread::attributes attrs; // set portable attributes // ... attr.set_stack_size(4096*10); #if defined(BOOST_THREAD_PLATFORM_WIN32) // ... window version #elif defined(BOOST_THREAD_PLATFORM_PTHREAD) // ... pthread version pthread_attr_setschedpolicy(attr.native_handle(), SCHED_RR); #else #error "Boost threads unavailable on this platform" #endif boost::thread th(attrs, find_the_question, 42);
На платформах Windows это не так просто, так как нет типа, который компилирует атрибуты потоков. Существует связь с созданием потока в Windows, который эмулируется через поток::Attributes class. Это атрибуты LPSECURITY_ATTRIBUTES lpThreadAttributes. Повышаю. Thread предоставляет непортативную функцию set_security, чтобы пользователь мог предоставить ее перед созданием потока следующим образом:
#if defined(BOOST_THREAD_PLATFORM_WIN32) boost::thread::attributes attrs; // set portable attributes attr.set_stack_size(4096*10); // set non portable attribute LPSECURITY_ATTRIBUTES sec; // init sec attr.set_security(sec); boost::thread th(attrs, find_the_question, 42); // Set other thread attributes using the native_handle_type. //... #else #error "Platform not supported" #endif
Если функция или вызывающий объект перешли к<boost::thread
>Конструктор распространяет исключение, когда на него ссылаются, которое не относится к типу<boost::thread_interrupted
>,<std::terminate()
>называется.
Поток может быть отделен путем явного вызова.<detach()
>Функция члена на<boost::thread
>объекте. В этом случае<boost::thread
>объект перестает представлять теперь отдельную нить, а вместо этого представляет.Не-нить.
int main() { boost::thread t(my_func); t.detach(); }
Для того, чтобы дождаться окончания нити исполнения, необходимо использовать<join()
>, __join_for или __join_until<timed_join()
>функции члена объекта<boost::thread
>.<join()
>будет блокировать вызывающую нить, пока нить, представленная<boost::thread
>Объект завершен.
int main() { boost::thread t(my_func); t.join(); }
Если нить исполнения, представленная<boost::thread
>объектом, уже завершена, или<boost::thread
>объект представляетНе-нить, то<join()
>возвращается немедленно.
int main() { boost::thread t; t.join(); // do nothing }
Присоединение на основе времени аналогично, за исключением того, что вызов __join_for или __join_until также вернется, если ожидаемый поток не завершится, когда указанное время истекло или достигло соответственно.
int main() { boost::thread t; if ( t.join_for(boost::chrono::milliseconds(500)) ) // do something else t.join(); // join anyway }
Когда объект<boost::thread
>, представляющий нить исполнения, разрушается, нить становитсяотсоединенной. Как только нить отделена, она будет продолжать выполняться до тех пор, пока не будет завершен вызов функции или вызывающего объекта, поставляемого на строительство, или программа не будет завершена. Нить также может быть отделена путем явного вызова.<detach()
>функция члена на<boost::thread
>объекте. В этом случае<boost::thread
>объект перестает представлять теперь отдельную нить, а вместо этого представляетНе-нить.
Когда объект<boost::thread
>, представляющий нить выполнения, разрушается, программа прекращает работу, если нить __joinable__.
int main() { boost::thread t(my_func); } // calls std::terminate()
Вы можете использовать thread_joiner, чтобы убедиться, что поток был соединен с разрушителем потока.
int main() { boost::thread t(my_func); boost::thread_joiner g(t); // do something else } // here the thread_joiner destructor will join the thread before it is destroyed.
Бегущая нить может бытьпрерванапутем вызова.<interrupt()
>функция члена соответствующего<boost::thread
>объекта. Когда прерванный поток далее выполняет одну из указанныхточек прерывания(или если он в настоящее времязаблокированпри выполнении одного) с включенным прерыванием, то в прерванный поток будет брошено исключение<boost::thread_interrupted
>. Если это исключение не улавливается внутри основной функции прерываемого потока, процесс раскручивания стека (как и любое другое исключение) вызывает выполнение деструкторов с автоматической продолжительностью хранения. В отличие от других исключений, когда<boost::thread_interrupted
>распространяется из основной функции резьбы, это не вызывает призыва к<std::terminate
>; эффект таков, как будто основная функция резьбы вернулась нормально.
Если нить желает избежать прерывания, она может создать экземпляр<boost::this_thread::disable_interruption
>. Объекты этого класса отключают прерывание для нити, создавшей их на конструкцию, и восстанавливают состояние прерывания до того, что было до разрушения:
void f() { // interruption enabled here { boost::this_thread::disable_interruption di; // interruption disabled { boost::this_thread::disable_interruption di2; // interruption still disabled } // di2 destroyed, interruption state restored // interruption still disabled } // di destroyed, interruption state restored // interruption now enabled }
Эффекты экземпляра<boost::this_thread::disable_interruption
>могут быть временно обращены вспять путем построения экземпляра<boost::this_thread::restore_interruption
>, проходя в рассматриваемом объекте<boost::this_thread::disable_interruption
>. Это восстановит состояние прерывания до того, как оно было.<boost::this_thread::disable_interruption
>объект был построен, а затем снова отключить прерывание, когда<boost::this_thread::restore_interruption
>объект разрушен.
void g() { // interruption enabled here { boost::this_thread::disable_interruption di; // interruption disabled { boost::this_thread::restore_interruption ri(di); // interruption now enabled } // ri destroyed, interruption disable again } // di destroyed, interruption state restored // interruption now enabled }
В любой точке состояние прерывания для текущего потока может быть запрошено путем вызова<boost::this_thread::interruption_enabled()
>.
Следующими функциями являютсяточки прерывания, которые будут бросать<boost::thread_interrupted
>, если прерывание включено для текущего потока, и прерывание запрашивается для текущего потока:
boost::thread::join()
>boost::thread::timed_join()
>boost::thread
>::<try_join_for
>[]
boost::thread
>::<try_join_until
>
boost::condition_variable::wait()
>boost::condition_variable::timed_wait()
>boost::condition_variable
>::<wait_for
>[]
boost::condition_variable
>::<wait_until
>[]
boost::condition_variable_any::wait()
>boost::condition_variable_any::timed_wait()
>boost::condition_variable_any
>::<wait_for
>[]
boost::condition_variable_any
>::<wait_until
>[]
boost::thread::sleep()
>boost::this_thread::sleep_for
>[]
boost::this_thread::sleep_until
>()
boost::this_thread::interruption_point()
>Объекты класса<boost::thread::id
>могут использоваться для идентификации потоков. Каждый исполняемый поток исполнения имеет уникальный идентификатор, получаемый из соответствующего<boost::thread
>путем вызова функции<get_id()
>члена или вызова<boost::this_thread::get_id()
>из потока. Объекты класса<boost::thread::id
>могут копироваться и использоваться в качестве ключей в ассоциативных контейнерах: предоставляется полный спектр операторов сравнения. Идентификаторы потока также могут быть записаны в выходной поток с помощью оператора вставки потока, хотя выходной формат не указан.
Каждый экземпляр<boost::thread::id
>либо относится к некоторой нити, либоНе-нить. Случаи, относящиеся кНе-нитьсравниваются равными друг другу, но не равными любым экземплярам, которые относятся к фактической нити исполнения. Операторы сравнения на<boost::thread::id
>дают общий заказ на каждый неравный идентификатор потока.
<boost::thread
>класс имеет членов<native_handle_type
>и<native_handle
>, обеспечивающих доступ к базовой нативной рукоятке.
Эта нативная ручка может быть использована для изменения, например, расписания.
В общем, небезопасно использовать эту ручку с операциями, которые могут конфликтовать с теми, которые предоставляет Boost. Нить. Примером плохого использования может быть отсоединение потока непосредственно, поскольку оно не изменит внутренние части экземпляра<boost::thread
>, поэтому, например, присоединяемая функция будет продолжать возвращать истинность, в то время как нативная резьба больше не присоединяется.
thread t(fct); thread::native_handle_type hnd=t.native_handle(); pthread_detach(hnd); assert(t.joinable());
Любой поток выполнения, созданный с помощью нативного интерфейса, называется нативным потоком в этой документации.
Первый пример нативной нити исполнения является основной нитью.
Пользователь может получить доступ к некоторым функциям синхронизации, связанным с потоком нативного тока, используя функции<boost::this_thread
><yield
>,<sleep
>,<sleep_for
>,<sleep_until
>.
int main() { // ... boost::this_thread::sleep_for(boost::chrono::milliseconds(10)); // ... }
Конечно, все средства синхронизации предоставлены Boost. Нить также доступна на родных нитях.
Функции, связанные с прерыванием<boost::this_thread
>, ведут себя в деградированном режиме при вызове из потока, созданного с использованием нативного интерфейса, то есть<boost::this_thread::interruption_enabled()
>возвращает ложное. Как следствие, использование<boost::this_thread::disable_interruption
>и<boost::this_thread::restore_interruption
>ничего не сделает, и призывы к<boost::this_thread::interruption_point()
>будут просто проигнорированы.
Поскольку единственный способ прервать нить - через экземпляр<boost::thread
>,<interruption_request()
>вернется ложным для нативных нитей.
pthread_exit
POSIX limitation
<pthread_exit
>в glibc/NPTL вызывает «вынужденное раскручивание», что почти похоже на исключение C++, но не совсем. На Mac OS X, например,<pthread_exit
>разворачивается без вызова деструкторов C++.
Такое поведение несовместимо с нынешним ростом. Конструкция нити, поэтому использование этой функции в потоке POSIX приводит к неопределенному поведению любого Boost. Функция нити.
joinable()
join()
timed_join()
DEPRECATEDtry_join_for()
EXTENSIONtry_join_until()
EXTENSIONdetach()
get_id()
interrupt()
EXTENSIONhardware_concurrency()
physical_concurrency()
native_handle()
operator==
DEPRECATEDoperator!=
DEPRECATEDsleep()
DEPRECATEDyield()
DEPRECATEDswap()
swap()
boost::thread::id
boost::thread::attributes
EXTENSION#include <boost/thread/thread.hpp> class thread { public: class attributes; // EXTENSION thread() noexcept; ~thread(); thread(const thread&) = delete; thread& operator=(const thread&) = delete; // move support thread(thread&&) noexcept; thread& operator=(thread&&) noexcept; template <class F> explicit thread(F f); template <class F> thread(F &&f); template <class F,class A1,class A2,...> thread(F f,A1 a1,A2 a2,...); template <class F, class ...Args> explicit thread(F&& f, Args&&... args); template <class F> explicit thread(attributes& attrs, F f); // EXTENSION template <class F> thread(attributes& attrs, F &&f); // EXTENSION template <class F, class ...Args> explicit thread(attributes& attrs, F&& f, Args&&... args); void swap(thread& x) noexcept; class id; id get_id() const noexcept; bool joinable() const noexcept; void join(); template <class Rep, class Period> bool try_join_for(const chrono::duration<Rep, Period>& rel_time); // EXTENSION template <class Clock, class Duration> bool try_join_until(const chrono::time_point<Clock, Duration>& t); // EXTENSION void detach(); static unsigned hardware_concurrency() noexcept; static unsigned physical_concurrency() noexcept; typedef platform-specific-type native_handle_type; native_handle_type native_handle(); void interrupt(); // EXTENSION bool interruption_requested() const noexcept; // EXTENSION #if defined BOOST_THREAD_USES_DATETIME bool timed_join(const system_time& wait_until); // DEPRECATED template<typename TimeDuration> bool timed_join(TimeDuration const& rel_time); // DEPRECATED static void sleep(const system_time& xt);// DEPRECATED #endif #if defined BOOST_THREAD_PROVIDES_THREAD_EQ bool operator==(const thread& other) const; // DEPRECATED bool operator!=(const thread& other) const; // DEPRECATED #endif static void yield() noexcept; // DEPRECATED }; void swap(thread& lhs,thread& rhs) noexcept;
thread() noexcept;
Построен экземпляр<boost::thread
>, который относится кНе-нить.
<this->get_id()==thread::id()
>
Ничего.
thread(thread&& other) noexcept;
Переносит право собственности на нить, управляемую<other
>(если таковая имеется), в недавно построенный<boost::thread
>экземпляр.
<other.get_id()==thread::id()
>и<get_id()
>возвращает значение<other.get_id()
>до начала строительства.
Ничего.
thread& operator=(thread&& other) noexcept;
Передача права собственности на нить, управляемую<other
>(если таковая имеется)<*this
>.
- если определено BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: Если поток является соединяемым вызовом<detach()
>
- если определено BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE: Если в строке есть соединительные вызовы<std::terminate()
>.
<other->get_id()==thread::id()
>и<get_id()
>возвращает значение<other.get_id()
>до назначения.
Ничего.
template<typename Callable> thread(Callable func);
<Callable
>должно быть копируемым и<func()
>должно быть действительным выражением.
<func
>копируется в хранилище, управляемое внутренней библиотекой потоков, и эта копия вызывается на вновь созданный поток выполнения. Если это вызов приводит к распространению исключения во внутренние части библиотеки потоков, которые не являются типом<boost::thread_interrupted
>, тогда<std::terminate()
>будет вызван. Любая обратная стоимость от этого вызова игнорируется.
<*this
>относится к вновь созданной нити исполнения и<this->get_id()!=thread::id()
>.
<boost::thread_resource_error
>При возникновении ошибки.
resource_unavailable_try_again: системе не хватало необходимых ресурсов для создания другой нити, или был бы превышен установленный системой лимит на количество потоков в процессе.
template<typename Callable> thread(attributes& attrs, Callable func);
<Callable
>должен быть скопирован.
<func
>копируется в хранилище, управляемое внутренней библиотекой потоков, и эта копия вызывается на вновь созданный поток выполнения с указанными атрибутами. Если это вызов приводит к распространению исключения во внутренние части библиотеки потоков, которые не являются типом<boost::thread_interrupted
>, тогда<std::terminate()
>будет вызван. Любая обратная стоимость от этого вызова игнорируется. Если атрибуты объявляют нативную нить отдельной, то усилитель::thread будет отделен.
<*this
>относится к вновь созданной нити исполнения и<this->get_id()!=thread::id()
>.
<boost::thread_resource_error
>При возникновении ошибки.
resource_unavailable_try_again: системе не хватало необходимых ресурсов для создания другой нити, или был бы превышен установленный системой лимит на количество потоков в процессе.
template<typename Callable> thread(Callable &&func);
<Callable
>должно быть подвижным.
<func
>перемещается в хранилище, управляемое внутренней библиотекой потоков, и эта копия вызывается на вновь созданный поток выполнения. Если это вызов приводит к тому, что исключение распространяется на внутренности библиотеки потоков, которая не является типом<boost::thread_interrupted
>, тогда<std::terminate()
>будет вызван. Любая обратная стоимость от этого вызова игнорируется.
<*this
>относится к вновь созданной нити исполнения и<this->get_id()!=thread::id()
>.
<boost::thread_resource_error
>При возникновении ошибки.
resource_unavailable_try_again: системе не хватало необходимых ресурсов для создания другой нити, или был бы превышен установленный системой лимит на количество потоков в процессе.
template<typename Callable> thread(attributes& attrs, Callable func);
<Callable
>должен быть скопирован.
<func
>копируется в хранилище, управляемое внутренней библиотекой потоков, и эта копия вызывается на вновь созданный поток выполнения с указанными атрибутами. Если это вызов приводит к распространению исключения во внутренние части библиотеки потоков, которые не являются типом<boost::thread_interrupted
>, тогда<std::terminate()
>будет вызван. Любая обратная стоимость от этого вызова игнорируется. Если атрибуты объявляют нативную нить отдельной, то усилитель::thread будет отделен.
<*this
>относится к вновь созданной нити исполнения и<this->get_id()!=thread::id()
>.
<boost::thread_resource_error
>При возникновении ошибки.
resource_unavailable_try_again: системе не хватало необходимых ресурсов для создания другой нити, или был бы превышен установленный системой лимит на количество потоков в процессе.
template <class F,class A1,class A2,...> thread(F f,A1 a1,A2 a2,...);
<F
>и каждый<A
>n должен быть копируемым или подвижным.
<*this
>относится к вновь созданной нити исполнения.
<boost::thread_resource_error
>При возникновении ошибки.
resource_unavailable_try_again: системе не хватало необходимых ресурсов для создания другой нити, или был бы превышен установленный системой лимит на количество потоков в процессе.
В настоящее время в дополнение к функции<f
>можно указать до девяти дополнительных аргументов<a1
>-<a9
>.
~thread();
- если определено BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE: Если поток соединен с вызовами<detach()
>, DEPRECATED
- если определено BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE: Если же в этом случае речь идет о<std::terminate
>. Уничтожает<*this
>.
Ничего.
Причина перехода на std::terminate заключается в том, что либо неявное отсоединение, либо присоединение нити<joinable()
>в ее деструкторе может привести к трудной отладке корректности (для<detach
>) или производительности (для<join
>) ошибок, встречающихся только при повышении исключения. Таким образом, программист должен убедиться, что деструктор никогда не выполняется, пока резьба все еще соединена. Присоединяйтесь к потоку перед разрушением или используйте ограниченную нить.
bool joinable() const noexcept;
<true
>если<*this
>относится к потоку исполнения,<false
>иначе.
Ничего.
void join();
Нить привязывается.
Если<*this
>относится к потоку выполнения, ожидайте, пока этот поток выполнения завершится.
Завершение потока, представленного<*this
>, синхронизируется с соответствующим успешным<join()
>возвратом.
Операции на *это не синхронизированы.
Если<*this
>относится к нити исполнения на входе, эта нить исполнения завершена.<*this
>больше не относится к какой-либо нити исполнения.
<boost::thread_interrupted
>если текущий поток выполнения прерывается или<system_error
>
resource_deadlock_would_occur: если обнаружен тупик или<this->get_id()==boost::this_thread::get_id()
>.
недействительный_аргумент: если нить не соединена и<BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
>определена.
<join()
>является одним из предопределенных.точки прерывания.
bool timed_join(const system_time& wait_until); template<typename TimeDuration> bool timed_join(TimeDuration const& rel_time);
![]() |
Warning |
---|---|
Снят с 3.00. Используйте вместо этого< |
Нить привязывается.
Если<*this
>относится к потоку выполнения, ожидает, что эта нить выполнения будет завершена, время<wait_until
>было достигнуто или указанная продолжительность<rel_time
>истекла. Если<*this
>не относится к потоку исполнения, немедленно возвращается.
<true
>, если<*this
>относится к потоку исполнения на входе, и этот поток исполнения завершен до истечения времени вызова,<false
>в противном случае.
Если<*this
>относится к потоку исполнения на входе и<timed_join
>возвращается<true
>, то этот поток исполнения завершен, и<*this
>больше не относится к любому потоку исполнения. Если этот призыв<timed_join
>возвращается<false
>,<*this
>остается неизменным.
<boost::thread_interrupted
>если текущий поток выполнения прерывается или<system_error
>
resource_deadlock_would_occur: если обнаружен тупик или это->get_id() == boost::this_thread::get_id().
недействительный_аргумент: Если нить не соединена и определена BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED.
<timed_join()
>является одной из предопределенныхточек прерывания.
template <class Rep, class Period> bool try_join_for(const chrono::duration<Rep, Period>& rel_time);
Нить привязывается.
Если<*this
>относится к потоку исполнения, ожидая завершения этой нити исполнения, указанная продолжительность<rel_time
>истекла. Если<*this
>не относится к нити исполнения, немедленно возвращается.
<true
>, если<*this
>относится к потоку исполнения на входе, и этот поток исполнения завершен до истечения времени вызова,<false
>в противном случае.
Если<*this
>относится к потоку исполнения на входе и<try_join_for
>возвращает<true
>, то этот поток исполнения завершен, и<*this
>больше не относится к любому потоку исполнения. Если этот призыв<try_join_for
>возвращается<false
>,<*this
>остается неизменным.
<boost::thread_interrupted
>если текущий поток выполнения прерывается или<system_error
>
resource_deadlock_would_occur: если обнаружен тупик или это->get_id() == boost::this_thread::get_id().
недействительный_аргумент: Если нить не соединена и определена BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED.
<try_join_for()
>является одной из предопределенныхточек прерывания.
template <class Clock, class Duration> bool try_join_until(const chrono::time_point<Clock, Duration>& abs_time);
Нить привязывается.
Если<*this
>относится к нити исполнения, ожидает, что эта нить исполнения будет завершена, время<abs_time
>было достигнуто. Если<*this
>не относится к нити исполнения, немедленно возвращается.
<true
>, если<*this
>относится к потоку исполнения на входе, и этот поток исполнения завершен до истечения времени вызова,<false
>в противном случае.
Если<*this
>относится к потоку исполнения на входе и<try_join_until
>возвращает<true
>, то этот поток исполнения завершен, и<*this
>больше не относится к любому потоку исполнения. Если этот призыв<try_join_until
>возвращается<false
>,<*this
>остается неизменным.
<boost::thread_interrupted
>если текущий поток выполнения прерывается или<system_error
>
resource_deadlock_would_occur: если обнаружен тупик или это->get_id() == boost::this_thread::get_id().
недействительный_аргумент: Если нить не соединена и определена BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED.
<try_join_until()
>является одной из предопределенныхточек прерывания.
void detach();
Нить привязывается.
Нить исполнения отсоединяется и больше не имеет связанного<boost::thread
>объекта.
<*this
>больше не относится к какой-либо нити исполнения.
<system_error
>
no_such_process: если поток недействителен.
недействительный_аргумент: Если нить не соединена и определена BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED.
thread::id get_id() const noexcept;
Если<*this
>относится к резьбе исполнения, экземпляр<boost::thread::id
>, который представляет эту резьбу. В противном случае возвращается построенный по умолчанию<boost::thread::id
>.
Ничего.
void interrupt();
Если<*this
>относится к потоку выполнения, попросите, чтобы поток прерывался в следующий раз, когда он входит в одну из предопределенныхточек прерыванияс включенным прерыванием, или если в настоящее времязаблокированв вызове к одной из предопределенныхточек прерыванияс включенным прерыванием. В противном случае не отмечайте.
Ничего.
unsigned hardware_concurrency() noexcept;
Количество аппаратных потоков, доступных в текущей системе (например, количество процессоров, ядер или блоков гиперпоточности), или 0, если эта информация недоступна.
Ничего.
unsigned physical_concurrency() noexcept;
Количество физических ядер, доступных в текущей системе. В отличие от<hardware_concurrency()
>он не возвращает количество виртуальных ядер, но считает только физические ядра.
Ничего.
typedef platform-specific-type native_handle_type; native_handle_type native_handle();
Возвращает экземпляр<native_handle_type
>, который может использоваться с API-интерфейсами для управления базовой реализацией. Если таких случаев нет, то<native_handle()
>и<native_handle_type
>отсутствуют.
Ничего.
bool operator==(const thread& other) const;
<get_id()==other.get_id()
>
bool operator!=(const thread& other) const;
<get_id()!=other.get_id()
>
void sleep(system_time const& abs_time);
![]() |
Warning |
---|---|
Снят с 3.0.0. Используйте< |
Приостанавливает текущую нить до достижения указанного времени.
<boost::thread_interrupted
>если текущий поток выполнения прерывается.
<sleep()
>является одной из предопределенныхточек прерывания.
void swap(thread& other) noexcept;
Обмен нитями исполнения, связанными с<*this
>и<other
>, поэтому<*this
>связан с ниткой исполнения, связанной с<other
>до вызова, и наоборот.
<this->get_id()
>возвращает то же значение, что и<other.get_id()
>до вызова.<other.get_id()
>возвращает то же значение, что и<this->get_id()
>до вызова.
Ничего.
#include <boost/thread/thread.hpp> void swap(thread& lhs,thread& rhs) noexcept;
#include <boost/thread/thread.hpp> class thread::id { public: id() noexcept; bool operator==(const id& y) const noexcept; bool operator!=(const id& y) const noexcept; bool operator<(const id& y) const noexcept; bool operator>(const id& y) const noexcept; bool operator<=(const id& y) const noexcept; bool operator>=(const id& y) const noexcept; template<class charT, class traits> friend std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const id& x); };
id() noexcept;
Построен экземпляр<boost::thread::id
>, представляющийНе-нить.
Ничего.
bool operator==(const id& y) const noexcept;
<true
>, если<*this
>и<y
>оба представляют одну и ту же нить исполнения, или оба представляютНе-нить,<false
>иначе.
Ничего.
bool operator!=(const id& y) const noexcept;
<true
>, если<*this
>и<y
>представляют разные нити исполнения, или одна представляет нить исполнения, а другая представляетНе-нить,<false
>иначе.
Ничего.
bool operator<(const id& y) const noexcept;
<true
>, если<*this!=y
>является<true
>и определяемый реализацией полный порядок<boost::thread::id
>значений помещает<*this
>перед<y
>,<false
>иначе.
Ничего.
<boost::thread::id
>экземпляр, представляющийНе-поток, всегда будет сравнивать меньше экземпляра, представляющего нить исполнения.
template<class charT, class traits> friend std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const id& x);
Записывает представление экземпляра<boost::thread::id
><x
>в поток<os
>таким образом, что представление двух экземпляров<boost::thread::id
><a
>и<b
>одинаково, если<a==b
>, и различно, если<a!=b
>.
<os
>
class thread::attributes { public: attributes() noexcept; ~ attributes()=default; // stack void set_stack_size(std::size_t size) noexcept; std::size_t get_stack_size() const noexcept; #if defined BOOST_THREAD_DEFINES_THREAD_ATTRIBUTES_NATIVE_HANDLE typedef platform-specific-type native_handle_type; native_handle_type* native_handle() noexcept; const native_handle_type* native_handle() const noexcept; #endif };
thread_attributes() noexcept;
Конструирует экземпляр атрибутов потока с его значениями по умолчанию.
Ничего.
void set_stack_size(std::size_t size) noexcept;
Хранит размер стека, который будет использоваться для создания нити. Это намек на то, что реализация может выбрать лучший размер, если он маленький или слишком большой или не выровнен со страницей.
<this->
get_stack_size()
>возвращает выбранный размер стека.
Ничего.
std::size_t get_stack_size() const noexcept;
Размер стека, который будет использоваться для создания нити. Обратите внимание, что эта функция может возвращать 0, что означает по умолчанию.
Ничего.
typedef platform-specific-type native_handle_type; typedef platform-specific-type native_handle_type; native_handle_type* native_handle() noexcept; const native_handle_type* native_handle() const noexcept;
Возвращает экземпляр<native_handle_type
>, который можно использовать с API-интерфейсами для управления реализацией базовых атрибутов потоков. Если такого случая не существует,<native_handle()
>и<native_handle_type
>отсутствуют и<BOOST_THREAD_DEFINES_THREAD_ATTRIBUTES_NATIVE_HANDLE
>не определено.
Ничего.
get_id()
interruption_point()
EXTENSIONinterruption_requested()
EXTENSIONinterruption_enabled()
EXTENSIONsleep()
DEPRECATEDsleep_until()
sleep_for()
yield()
disable_interruption
EXTENSIONrestore_interruption
EXTENSIONat_thread_exit()
EXTENSIONnamespace boost { namespace this_thread { thread::id get_id() noexcept; template<typename TimeDuration> void yield() noexcept; template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time); template<typename Callable> void at_thread_exit(Callable func); // EXTENSION void interruption_point(); // EXTENSION bool interruption_requested() noexcept; // EXTENSION bool interruption_enabled() noexcept; // EXTENSION class disable_interruption; // EXTENSION class restore_interruption; // EXTENSION #if defined BOOST_THREAD_USES_DATETIME void sleep(TimeDuration const& rel_time); // DEPRECATED void sleep(system_time const& abs_time); // DEPRECATED #endif } }
#include <boost/thread/thread.hpp> namespace this_thread { thread::id get_id() noexcept; }
Пример<boost::thread::id
>, который представляет собой текущий исполняющий поток.
<boost::thread_resource_error
>При возникновении ошибки.
#include <boost/thread/thread.hpp> namespace this_thread { void interruption_point(); }
Проверьте, был ли прерван текущий поток.
<boost::thread_interrupted
>если<boost::this_thread::interruption_enabled()
>и<boost::this_thread::interruption_requested()
>оба возвращаются<true
>.
#include <boost/thread/thread.hpp> namespace this_thread { bool interruption_requested() noexcept; }
<true
>если для текущей нити было запрошено прерывание,<false
>иначе.
Ничего.
#include <boost/thread/thread.hpp> namespace this_thread { bool interruption_enabled() noexcept; }
<true
>если для текущей нити было запрошено прерывание,<false
>иначе.
Ничего.
#include <boost/thread/thread.hpp> namespace this_thread { template<typename TimeDuration> void sleep(TimeDuration const& rel_time); void sleep(system_time const& abs_time) }
![]() |
Warning |
---|---|
Снят с 3.0.0. Вместо этого используйте< |
Приостанавливает текущую нить до истечения периода времени, указанного в<rel_time
>, или до достижения момента времени, указанного в<abs_time
>.
<boost::thread_interrupted
>если текущий поток выполнения прерывается.
<sleep()
>является одной из предопределенныхточек прерывания.
#include <boost/thread/thread.hpp> namespace this_thread { template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); namespace no_interruption_point { template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); } }
Приостанавливает текущую нить до тех пор, пока не будет достигнут момент времени, указанный в<abs_time
>.
Ничего, если часы удовлетворяют требованиям TrivialClock, и операции Duration не делают исключений.<boost::thread_interrupted
>если текущий поток выполнения прерывается.
<sleep_until()
>является одним из предопределенных.точки прерывания.
<no_interruption_point::sleep_until()
>не является одной източек прерывания.
#include <boost/thread/thread.hpp> namespace this_thread { template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time); namespace no_interruption_point { template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time); } }
Приостанавливает текущую нить до истечения срока, указанного<rel_time
>.
Ничего, если операции хроно::durationboost::thread_interrupted
>если текущий поток выполнения прерывается.
<sleep_for()
>является одной из предопределенныхточек прерывания.
<no_interruption_point::sleep_for()
>НЕ является одной източек прерывания.
#include <boost/thread/thread.hpp> namespace this_thread { void yield() noexcept; }
Отказывается от оставшейся части временного среза текущего потока, чтобы позволить другим потокам работать.
Ничего.
#include <boost/thread/thread.hpp> namespace this_thread { class disable_interruption { public: disable_interruption(const disable_interruption&) = delete; disable_interruption& operator=(const disable_interruption&) = delete; disable_interruption() noexcept; ~disable_interruption() noexcept; }; }
<boost::this_thread::disable_interruption
>отключает прерывание для текущей нити на строительстве и восстанавливает состояние предыдущего прерывания на разрушении. Случаи<disable_interruption
>нельзя копировать или перемещать.
disable_interruption() noexcept;
Хранит текущее состояние<boost::this_thread::interruption_enabled()
>и отключает прерывание для текущего потока.
<boost::this_thread::interruption_enabled()
>возвращается<false
>для текущей нити.
Ничего.
~disable_interruption() noexcept;
Он должен быть вызван из той же нити, из которой был построен<*this
>.
Восстанавливает текущее состояние<boost::this_thread::interruption_enabled()
>для текущей нити до того, что до строительства<*this
>.
<boost::this_thread::interruption_enabled()
>для текущей резьбы возвращает значение, сохраненное в конструкторе<*this
>.
Ничего.
#include <boost/thread/thread.hpp> namespace this_thread { class restore_interruption { public: restore_interruption(const restore_interruption&) = delete; restore_interruption& operator=(const restore_interruption&) = delete; explicit restore_interruption(disable_interruption& disabler) noexcept; ~restore_interruption() noexcept; }; }
При строительстве экземпляра<boost::this_thread::restore_interruption
>состояние прерывания для текущей резьбы восстанавливается до состояния прерывания, сохраненного конструктором поставляемого экземпляра<boost::this_thread::disable_interruption
>. Когда экземпляр уничтожен, прерывание снова отключено. Случаи<restore_interruption
>не могут быть скопированы или перенесены.
explicit restore_interruption(disable_interruption& disabler) noexcept;
Он должен быть вызван из той же нити, из которой был построен<disabler
>.
Восстанавливает текущее состояние<boost::this_thread::interruption_enabled()
>для текущей нити до того, что до строительства<disabler
>.
<boost::this_thread::interruption_enabled()
>для текущей резьбы возвращает значение, сохраненное в конструкторе<disabler
>.
Ничего.
~restore_interruption() noexcept;
Он должен быть вызван из той же нити, из которой был построен<*this
>.
Отключает прерывание для текущего потока.
<boost::this_thread::interruption_enabled()
>для текущей резьбы возвращается<false
>.
Ничего.
#include <boost/thread/thread.hpp> template<typename Callable> void at_thread_exit(Callable func);
Копия<func
>помещается в хранилище для конкретных потоков. Эта копия вызывается при выходе текущего потока (даже если поток был прерван).
Копия<func
>была сохранена для вызова на выходе резьбы.
<std::bad_alloc
>если память не может быть выделена для копии функции,<boost::thread_resource_error
>если в библиотеке потоков возникает какая-либо другая ошибка. Любое исключение, брошенное при копировании<func
>во внутреннее хранилище.
Эта функцияне называется, если поток был принудительно прекращен с использованием API-интерфейсов для конкретной платформы, или если поток прекращается из-за вызова<exit()
>,<abort()
>или<std::terminate()
>. В частности, возвращение из<main()
>эквивалентно вызову в<exit()
>, поэтому не будет вызывать никаких функций, зарегистрированных в<at_thread_exit()
>.
#include <boost/thread/thread.hpp> class thread_group { public: thread_group(const thread_group&) = delete; thread_group& operator=(const thread_group&) = delete; thread_group(); ~thread_group(); template<typename F> thread* create_thread(F threadfunc); void add_thread(thread* thrd); void remove_thread(thread* thrd); bool is_this_thread_in(); bool is_thread_in(thread* thrd); void join_all(); void interrupt_all(); int size() const; };
<thread_group
>предусматривает набор нитей, которые каким-либо образом связаны между собой. Новые потоки могут быть добавлены в группу с функциями<add_thread
>и<create_thread
>.<thread_group
>не является копируемым или подвижным.
template<typename F> thread* create_thread(F threadfunc);
Создайте новый<boost::thread
>объект по<newthread(threadfunc)
>и добавьте его в группу.
<this->size()
>увеличивается на единицу, новая нить запускается.
Указатель на новый<boost::thread
>объект.
void add_thread(thread* thrd);
Выражение<deletethrd
>хорошо сформировано и не приводит к неопределенному поведению и<is_thread_in(thrd)==false
>.
Взять в собственность объект<boost::thread
>, на который указывает<thrd
>, и добавить его в группу.
<this->size()
>увеличивается на единицу.
void remove_thread(thread* thrd);
Если<thrd
>является членом группы, удалите его без вызова<delete
>.
Если<thrd
>был членом группы,<this->size()
>уменьшается на один.
void join_all();
<is_this_thread_in()==false
>.
Позвоните<join()
>по каждому<boost::thread
>объект в группе.
Каждая нить в группе заканчивается.
Поскольку<join()
>является одной из предопределенныхточек прерывания,<join_all()
>также является точкой прерывания.
bool is_this_thread_in();
Если в группе есть нить<th
>, то<th.get_id()==this_thread::get_id()
>.
bool is_thread_in(thread* thrd);
Если в группе есть нить<th
>, такая, что<th.get_id()==thrd->get_id()
>.
void interrupt_all();
Звоните<interrupt()
>по каждому<boost::thread
>объекту в группе.
Статья Thread Management раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 35. Thread 4.7.1 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 35. Thread 4.7.1 ::
реклама |