mutex.h.xml 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <chapter xml:id="mutex.h">
  2. <title><tt>__vic/mutex.h</tt></title>
  3. <chapter xml:id="mutex">
  4. <title><tt>mutex</tt></title>
  5. <code-block lang="C++">
  6. class mutex : private non_copyable
  7. {
  8. public:
  9. mutex();
  10. ~mutex();
  11. void lock();
  12. bool try_lock();
  13. bool unlock() noexcept;
  14. };
  15. </code-block>
  16. <p>Обычный нерекурсивный мьютекс.</p>
  17. <section><title>Замечания по использованию</title>
  18. <p>В большинстве случаев, явного использования <tt>lock()</tt> и
  19. <tt>unlock()</tt> нужно избегать. Вместо этого используйте класс
  20. <xref to="mutex_lock"/> для управления блокировкими. Он обеспечивает
  21. безопасность при исключениях и удобен для использования.</p>
  22. <p>В режиме C++11 <tt>std::mutex</tt> может быть более подходящим вариантом.</p>
  23. </section>
  24. <section><title>Члены класса</title>
  25. <synopsis>
  26. <prototype>mutex()</prototype>
  27. <p>Создаёт незаблокированный мьютекс.</p>
  28. </synopsis>
  29. <synopsis>
  30. <prototype>~mutex()</prototype>
  31. <p>Уничтожает мьютекс.</p>
  32. </synopsis>
  33. <synopsis>
  34. <prototype>void lock()</prototype>
  35. <p>Захватывает блокировку на мьютексе. Ждёт его освобождения, если он уже
  36. захвачен другим потоком в данный момент.</p>
  37. </synopsis>
  38. <synopsis>
  39. <prototype>bool try_lock()</prototype>
  40. <p>Пытается захватить мьютекс. Немедленно возвращает <tt>false</tt> без
  41. ожидания, если он уже захвачен другим потоком.</p>
  42. </synopsis>
  43. <synopsis>
  44. <prototype>bool unlock() noexcept</prototype>
  45. <p>Освобождает ранее захваченный мьютекс. Иногда может возвращать <tt>false</tt>
  46. в случае ошибок, но в общем случае обнаружение ошибок не гарантируется.</p>
  47. </synopsis>
  48. </section>
  49. <section><title>Пример</title>
  50. <p>См. <xref to="mutex_lock"/>.</p>
  51. </section>
  52. </chapter>
  53. <chapter xml:id="mutex_lock">
  54. <title><tt>mutex_lock</tt></title>
  55. <code-block lang="C++"><![CDATA[
  56. class mutex_lock : private non_copyable
  57. {
  58. public:
  59. enum adopt_t { adopt };
  60. explicit mutex_lock(mutex &mtx);
  61. mutex_lock(mutex &mtx, adopt_t);
  62. ~mutex_lock();
  63. };
  64. ]]></code-block>
  65. <p>Управляет блокировкой на мьютексе. Снимает блокировку по окончании времени
  66. жизни объекта.</p>
  67. <section><title>Члены класса</title>
  68. <synopsis>
  69. <prototype>adopt</prototype>
  70. <p>Тэг конструктора, подавляет захват мьютекса.</p>
  71. </synopsis>
  72. <synopsis>
  73. <prototype>explicit mutex_lock(mutex &amp;mtx)</prototype>
  74. <p>Захватывает <tt>mtx</tt>.</p>
  75. </synopsis>
  76. <synopsis>
  77. <prototype>~mutex_lock()</prototype>
  78. <p>Освобождает <tt>mtx</tt>.</p>
  79. </synopsis>
  80. <synopsis>
  81. <prototype>mutex_lock(mutex &amp;mtx, adopt_t)</prototype>
  82. <p>Принимает уже захваченный <tt>mtx</tt>. См. пример.</p>
  83. </synopsis>
  84. </section>
  85. <section><title>Пример</title>
  86. <code-block lang="C++">
  87. // Типичное использование
  88. __vic::mutex mtx;
  89. void reentrant_function()
  90. {
  91. __vic::mutex_lock lock(mtx);
  92. // Критическая секция до конца этого блока
  93. ...
  94. }
  95. // Использование незахватывающего конструктора
  96. if(mtx.try_lock()) // Пытаемся захватить мьютекс
  97. {
  98. // Мьютекс успешно захвачен
  99. __vic::mutex_lock lock(mtx, __vic::mutex_lock::adopt);
  100. // Критическая секция до конца этого блока
  101. ...
  102. }
  103. else
  104. {
  105. // Мьютекс удерживается другим потоком
  106. ...
  107. }
  108. </code-block>
  109. </section>
  110. </chapter>
  111. </chapter>