thread.h.xml 7.0 KB

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