123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <chapter xml:id="mutex.h">
- <title><tt>__vic/mutex.h</tt></title>
- <chapter xml:id="mutex">
- <title><tt>mutex</tt></title>
- <code-block lang="C++">
- class mutex : private non_copyable
- {
- public:
- mutex();
- ~mutex();
- void lock();
- bool try_lock();
- bool unlock() noexcept;
- };
- </code-block>
- <p>Обычный нерекурсивный мьютекс.</p>
- <section><title>Замечания по использованию</title>
- <p>В большинстве случаев, явного использования <tt>lock()</tt> и
- <tt>unlock()</tt> нужно избегать. Вместо этого используйте класс
- <xref to="mutex_lock"/> для управления блокировкими. Он обеспечивает
- безопасность при исключениях и удобен для использования.</p>
- <p>В режиме C++11 <tt>std::mutex</tt> может быть более подходящим вариантом.</p>
- </section>
- <section><title>Члены класса</title>
- <synopsis>
- <prototype>mutex()</prototype>
- <p>Создаёт незаблокированный мьютекс.</p>
- </synopsis>
- <synopsis>
- <prototype>~mutex()</prototype>
- <p>Уничтожает мьютекс.</p>
- </synopsis>
- <synopsis>
- <prototype>void lock()</prototype>
- <p>Захватывает блокировку на мьютексе. Ждёт его освобождения, если он уже
- захвачен другим потоком в данный момент.</p>
- </synopsis>
- <synopsis>
- <prototype>bool try_lock()</prototype>
- <p>Пытается захватить мьютекс. Немедленно возвращает <tt>false</tt> без
- ожидания, если он уже захвачен другим потоком.</p>
- </synopsis>
- <synopsis>
- <prototype>bool unlock() noexcept</prototype>
- <p>Освобождает ранее захваченный мьютекс. Иногда может возвращать <tt>false</tt>
- в случае ошибок, но в общем случае обнаружение ошибок не гарантируется.</p>
- </synopsis>
- </section>
- <section><title>Пример</title>
- <p>См. <xref to="mutex_lock"/>.</p>
- </section>
- </chapter>
- <chapter xml:id="mutex_lock">
- <title><tt>mutex_lock</tt></title>
- <code-block lang="C++"><![CDATA[
- class mutex_lock : private non_copyable
- {
- public:
- enum adopt_t { adopt };
- explicit mutex_lock(mutex &mtx);
- mutex_lock(mutex &mtx, adopt_t);
- ~mutex_lock();
- };
- ]]></code-block>
- <p>Управляет блокировкой на мьютексе. Снимает блокировку по окончании времени
- жизни объекта.</p>
- <section><title>Члены класса</title>
- <synopsis>
- <prototype>adopt</prototype>
- <p>Тэг конструктора, подавляет захват мьютекса.</p>
- </synopsis>
- <synopsis>
- <prototype>explicit mutex_lock(mutex &mtx)</prototype>
- <p>Захватывает <tt>mtx</tt>.</p>
- </synopsis>
- <synopsis>
- <prototype>~mutex_lock()</prototype>
- <p>Освобождает <tt>mtx</tt>.</p>
- </synopsis>
- <synopsis>
- <prototype>mutex_lock(mutex &mtx, adopt_t)</prototype>
- <p>Принимает уже захваченный <tt>mtx</tt>. См. пример.</p>
- </synopsis>
- </section>
- <section><title>Пример</title>
- <code-block lang="C++">
- // Типичное использование
- __vic::mutex mtx;
- void reentrant_function()
- {
- __vic::mutex_lock lock(mtx);
- // Критическая секция до конца этого блока
- ...
- }
- // Использование незахватывающего конструктора
- if(mtx.try_lock()) // Пытаемся захватить мьютекс
- {
- // Мьютекс успешно захвачен
- __vic::mutex_lock lock(mtx, __vic::mutex_lock::adopt);
- // Критическая секция до конца этого блока
- ...
- }
- else
- {
- // Мьютекс удерживается другим потоком
- ...
- }
- </code-block>
- </section>
- </chapter>
- </chapter>
|