:github_url: hide .. _class_Semaphore: Semaphore ========= **Наследует:** :ref:`RefCounted` **<** :ref:`Object` Механизм синхронизации, используемый для управления доступом к общему ресурсу потоками :ref:`Thread`. .. rst-class:: classref-introduction-group Описание ---------------- Синхронизирующий семафор, который можно использовать для синхронизации нескольких :ref:`Thread`. Инициализируется нулем при создании. Для двоичной версии см. :ref:`Mutex`. \ **Предупреждение:** Семафоры следует использовать осторожно, чтобы избежать взаимоблокировок. \ **Предупреждение:** Чтобы гарантировать, что операционная система сможет выполнить надлежащую очистку (без сбоев, без взаимоблокировок), должны быть соблюдены следующие условия: - Когда счетчик ссылок **Semaphore** достигает нуля и, следовательно, он уничтожается, ни один поток не должен его ожидать. - Когда счетчик ссылок :ref:`Thread` достигает нуля и, следовательно, он уничтожается, он не должен ожидать ни одного семафора. .. rst-class:: classref-introduction-group Обучающие материалы -------------------------------------- - :doc:`Использование многопоточности <../tutorials/performance/using_multiple_threads>` - :doc:`Потокобезопасные API <../tutorials/performance/thread_safe_apis>` .. rst-class:: classref-reftable-group Методы ------------ .. table:: :widths: auto +-------------------------+-----------------------------------------------------------------------------------+ | |void| | :ref:`post`\ (\ count\: :ref:`int` = 1\ ) | +-------------------------+-----------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`try_wait`\ (\ ) | +-------------------------+-----------------------------------------------------------------------------------+ | |void| | :ref:`wait`\ (\ ) | +-------------------------+-----------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator ---- .. rst-class:: classref-descriptions-group Описания метода ------------------------------ .. _class_Semaphore_method_post: .. rst-class:: classref-method |void| **post**\ (\ count\: :ref:`int` = 1\ ) :ref:`🔗` Понижает **Semaphore**, разрешая вход одному потоку или нескольким, если указано ``count``. .. rst-class:: classref-item-separator ---- .. _class_Semaphore_method_try_wait: .. rst-class:: classref-method :ref:`bool` **try_wait**\ (\ ) :ref:`🔗` Подобно :ref:`wait()`, но не блокирует, поэтому если значение равно нулю, немедленно завершается ошибкой и возвращается ``false``. Если не равно нулю, возвращается ``true``, чтобы сообщить об успешном завершении. .. rst-class:: classref-item-separator ---- .. _class_Semaphore_method_wait: .. rst-class:: classref-method |void| **wait**\ (\ ) :ref:`🔗` Ожидает **Semaphore**, если его значение равно нулю, блокирует до тех пор, пока не станет ненулевым. .. |virtual| replace:: :abbr:`virtual (Этот метод обычно должен быть переопределен пользователем, чтобы иметь какой-либо эффект.)` .. |required| replace:: :abbr:`required (This method is required to be overridden when extending its base class.)` .. |const| replace:: :abbr:`const (Этот метод не имеет побочных эффектов. Он не изменяет ни одну из переменных-членов экземпляра.)` .. |vararg| replace:: :abbr:`vararg (Этот метод принимает любое количество аргументов после описанных здесь.)` .. |constructor| replace:: :abbr:`constructor (Этот метод используется для создания типа.)` .. |static| replace:: :abbr:`static (Этот метод не нуждается в вызове экземпляра, поэтому его можно вызвать напрямую, используя имя класса.)` .. |operator| replace:: :abbr:`operator (Этот метод описывает допустимый оператор для использования с этим типом в качестве левого операнда.)` .. |bitfield| replace:: :abbr:`BitField (Это значение является целым числом, составленным как битовая маска следующих флагов.)` .. |void| replace:: :abbr:`void (Нет возвращаемого значения.)`