thread.h.xml 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <chapter xml:id="thread.h">
  2. <title><tt>__vic/thread.h</tt></title>
  3. <p>Поддержка вычислительных потоков.</p>
  4. <chapter xml:id="thread">
  5. <title><tt>thread</tt></title>
  6. <code-block lang="C++"><![CDATA[
  7. class thread : private non_copyable
  8. {
  9. public:
  10. class id;
  11. using native_handle_type = ]]><nt>&lt;implementation-defined></nt><![CDATA[;
  12. thread();
  13. virtual ~thread();
  14. // BEGIN C++11
  15. thread(thread &&o) noexcept;
  16. thread &operator=(thread &&o) noexcept;
  17. // END C++11
  18. void start();
  19. void cancel();
  20. void join();
  21. bool alive() const;
  22. bool joinable() const;
  23. id get_id() const;
  24. native_handle_type handle() const;
  25. protected:
  26. virtual void worker() = 0;
  27. };
  28. ]]></code-block>
  29. <p>Абстрактный базовый класс потоков. Реализует pattern «Active object».
  30. Унаследуйте данный класс и определите функцию <tt>worker()</tt>, содержимое
  31. которой будет выполнено в новом потоке после вызова <tt>start()</tt>. Затем
  32. где-то в Вашей программе Вы должны будете вызвать <tt>join()</tt> для
  33. освобождения ресурсов ОС, ассоциированных с порождённым потоком.</p>
  34. <note>Объект должен всегда жить дольше, чем ассоциированный с ним поток ОС.
  35. Если это соглашение будет нарушено, программа будет завершена вызовом
  36. <tt>std::terminate()</tt>.</note>
  37. <section><title>Члены класса</title>
  38. <synopsis>
  39. <prototype>thread()</prototype>
  40. <postcondition><tt>joinable() == false</tt></postcondition>
  41. </synopsis>
  42. <synopsis>
  43. <prototype>~thread()</prototype>
  44. <p>Вызывает <tt>std::terminate()</tt>, если нарушено предусловие.</p>
  45. <precondition><tt>joinable() == false || alive() == false</tt></precondition>
  46. </synopsis>
  47. <synopsis>
  48. <prototype>thread(thread &amp;&amp;o) noexcept <sign>C++11</sign></prototype>
  49. <p>Перемещающий конструктор для режима C++11.</p>
  50. </synopsis>
  51. <synopsis>
  52. <prototype>thread &amp;operator=(thread &amp;&amp;o) noexcept <sign>C++11</sign></prototype>
  53. <p>Перемещающее присваивание для режима C++11. Вызывает
  54. <tt>std::terminate()</tt>, если нарушено предусловие.</p>
  55. <precondition><tt>joinable() == false || alive() == false</tt></precondition>
  56. </synopsis>
  57. <synopsis>
  58. <prototype>void start()</prototype>
  59. <p>Порождает новый поток и вызывает в нём <tt>worker()</tt>.</p>
  60. <precondition><tt>joinable() == false</tt></precondition>
  61. <postcondition><tt>joinable() == true</tt></postcondition>
  62. </synopsis>
  63. <synopsis>
  64. <prototype>void cancel()</prototype>
  65. <p>Прерывает выполнение потока.</p>
  66. <precondition><tt>joinable() == true</tt></precondition>
  67. <postcondition><tt>joinable() == true</tt></postcondition>
  68. </synopsis>
  69. <synopsis>
  70. <prototype>void join()</prototype>
  71. <p>Ждёт завершения работы потока, если он выполняется в данный момент, и делает
  72. его <tt>joinable() == false</tt>.</p>
  73. <precondition><tt>joinable() == true</tt></precondition>
  74. <postcondition><tt>joinable() == false</tt></postcondition>
  75. </synopsis>
  76. <synopsis>
  77. <prototype>bool alive() const</prototype>
  78. <p>Возращает <tt>true</tt>, если выполнение потока ещё не завершилось
  79. (он находится в функции <tt>worker()</tt>).</p>
  80. <precondition><tt>joinable() == true</tt></precondition>
  81. </synopsis>
  82. <synopsis>
  83. <prototype>bool joinable() const</prototype>
  84. <p>Возвращает <tt>true</tt>, если объект имеет соответсвующий объект ОС
  85. (поток), созданный вызовом <tt>start()</tt> и ещё не уничтоженный вызовом
  86. <tt>join()</tt>.</p>
  87. </synopsis>
  88. <synopsis>
  89. <prototype>id get_id() const</prototype>
  90. <p>Возвращает ID потока.</p>
  91. </synopsis>
  92. <synopsis>
  93. <prototype>native_handle_type handle() const</prototype>
  94. <p>Возвращает дескриптор потока, используемый в данной ОС.</p>
  95. </synopsis>
  96. </section>
  97. </chapter>
  98. <chapter xml:id="thread--id">
  99. <title><tt>thread::id</tt></title>
  100. <code-block lang="C++"><![CDATA[
  101. class thread::id
  102. {
  103. public:
  104. id();
  105. explicit operator bool() const;
  106. native_handle_type handle() const;
  107. };
  108. bool operator==(thread::id a, thread::id b);
  109. bool operator!=(thread::id a, thread::id b);
  110. ]]></code-block>
  111. <p>Уникальный идентификатор потока. Может содержать значение, ассоциированное
  112. с потоком или специальное значение, не ассоциированное ни с одним потоком.</p>
  113. <section><title>Члены класса</title>
  114. <synopsis>
  115. <prototype>id()</prototype>
  116. <p>Создаёт специальное значение не ассоциированное ни с одним потоком.</p>
  117. <postcondition><tt>bool(*this) == false</tt></postcondition>
  118. </synopsis>
  119. <synopsis>
  120. <prototype>explicit operator bool() const</prototype>
  121. <p>Возвращает <tt>true</tt>, если объект хранит ID какого-то потока.</p>
  122. </synopsis>
  123. <synopsis>
  124. <prototype>native_handle_type handle() const</prototype>
  125. <p>Возвращает дескриптор потока, используемый в данной ОС.</p>
  126. <precondition><tt>bool(*this) == true</tt></precondition>
  127. </synopsis>
  128. <synopsis>
  129. <prototype>bool operator==(thread::id a, thread::id b)</prototype>
  130. <prototype>bool operator!=(thread::id a, thread::id b)</prototype>
  131. <p>Проверяет, ассоциированы ли <tt>a</tt> и <tt>b</tt> с одним и тем же
  132. потоком (либо оба содержат значение по умолчанию).</p>
  133. <invariant><tt>id() == id()</tt></invariant>
  134. </synopsis>
  135. </section>
  136. </chapter>
  137. <chapter xml:id="this_thread">
  138. <title><tt>this_thread</tt></title>
  139. <code-block lang="C++"><![CDATA[
  140. namespace this_thread
  141. {
  142. thread::id get_id();
  143. void sleep_ms(unsigned msec);
  144. }
  145. ]]></code-block>
  146. <p>Набор функций для манипуляции с текущим (вызывающим) потоком.</p>
  147. <synopsis>
  148. <prototype>thread::id get_id()</prototype>
  149. <p>Возвращает ID вызывающего потока.</p>
  150. </synopsis>
  151. <synopsis>
  152. <prototype>void sleep_ms(unsigned msec)</prototype>
  153. <p>Приостанавливает выполнение вызывающего потока на указанное время в
  154. миллисекундах.</p>
  155. </synopsis>
  156. </chapter>
  157. </chapter>