{"id":248651,"date":"2015-01-23T21:02:02","date_gmt":"2015-01-23T17:02:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=248651"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=248651","title":{"rendered":"<span class=\"post_title\">Posix threads<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/4f5\/1b5\/273\/4f51b527318729061e92340a50335823.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0420\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u2013 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0438\u0432\u0430\u0442\u0441\u044f, \u0442.\u0435. \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u0438\u043c\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. <\/p>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 GUI. GUI \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, loading screen \u2013 \u043e\u043d \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441, \u043f\u043e \u043c\u0435\u0440\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0418 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/dec\/bd2\/45a\/decbd245a1734ed186e86c618f49e4f9.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u0438 (threads). \u041f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0439 wrapper \u043d\u0430\u0434 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u041e\u0421, \u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 (\u043f\u0440\u0438\u0432\u0435\u0442, \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434). \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u043f\u043e\u0442\u043e\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"http:\/\/habrahabr.ru\/post\/40275\/\">\u00ab\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043d\u0438\u0442\u0438 (threads)?\u00bb<\/a> \u0438\u043b\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/164487\/\">\u00ab\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0432 Java\u00bb<\/a>. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u0438\u0441\u043a \u0432 \u043f\u043e\u043c\u043e\u0449\u044c. \u041d\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u041e\u0421 \u2013 POSIX threads.<br \/>  <a name=\"habracut\"><\/a><br \/>  POSIX\u00a0(\u0430\u043d\u0433\u043b.\u00a0portable\u00a0operating\u00a0system\u00a0interface for Unix\u00a0\u2014 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u00a0Unix)\u00a0\u2014 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043c\u0435\u0436\u0434\u0443\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439\u00a0\u0438\u00a0\u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439\u00a0(\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439\u00a0API), \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u044f\u0437\u044b\u043a\u0430 C \u0438 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445\u00a0UNIX-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0438 \u0434\u043b\u044f \u043d\u0435-Unix \u0441\u0438\u0441\u0442\u0435\u043c. \u0421\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 POSIX \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u043a\u043e\u043c\u0438\u0442\u0435\u0442\u043e\u043c 1003\u00a0IEEE. \u041c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u0438 (ISO) \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e c \u041c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0435\u0439 (IEC) \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 (POSIX) \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c\u00a0ISO\/IEC 9945.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e POSIX.1c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (IEEE Std 1003.1c-1995). \u042d\u0442\u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 API \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u0442\u043f. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/POSIX_Threads\">\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 API.<\/a><\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 loading-screen&#8217;a \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0421.<\/p>\n<pre><code class=\"cpp\">#include &lt;pthread.h&gt; #include &lt;unistd.h&gt; #define nil NULL size_t progress = 0; void drawProgress(void) {     while(progress &lt; 100) {         printf(&quot;Progress %lu \\n&quot;, progress);         sleep(1);     } } void loadData(void) {     while(progress &lt; 100) {         ++progress;         sleep(1);     } } int main(int argc, const char *argv[]) {     pthread_t drawer, loader;     pthread_create(&drawer, nil, (void *(*)(void *)) drawProgress, nil);     pthread_create(&loader, nil, (void *(*)(void *)) loadData, nil);     pthread_join(loader, nil);     pthread_join(drawer, nil);     return 0; } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0442\u0438\u043f\u0430 <b>pthread_t <\/b> \u2013 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f API Posix.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>pthread_create<\/b>, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0438\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0435\u043a\u0441\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043e\u0442\u043e\u043a\u0430, \u0432\u0442\u043e\u0440\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0438\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0448\u0435 nil, \u0442\u0440\u0435\u0442\u044c\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u0442\u043e\u043c \u2013 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a, \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u2013 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u043e\u0436\u0435 nil (nil \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0447\u0435\u043c NULL, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0430). \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u043d\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c void* \u2014 \u0442.\u0435. \u0441\u044b\u0440\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d pthread_create, \u043f\u043e\u0442\u043e\u043a \u043e\u0442\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0422.\u0435. \u0432\u0441\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 <b>pthread_create<\/b> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2013 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e main \u043f\u043e\u0442\u043e\u043a\u0430 (\u0432 \u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f main \u0444\u0443\u043d\u043a\u0446\u0438\u044f).<\/p>\n<p>  <b>pthread_join<\/b> \u2013 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b main \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0445 \u0434\u0432\u0443\u0445, \u0430 \u0436\u0434\u0430\u043b \u0438\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<p>  \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0436\u0434\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 loader, \u0430 \u043f\u043e\u0442\u043e\u043c drawer. \u041d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0432\u0430\u0436\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0411\u0443\u0434\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442.\u043a. \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0442.\u0434. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b. \u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0442\u043c\u0435\u043d\u0443.<\/p>\n<pre><code class=\"cpp\">typedef struct {     size_t progress;     int errorCode; } ThreadArg; void drawProgress(void *arg) {     ThreadArg *argument = arg;     while(argument-&gt;progress &lt; 100) {         printf(&quot;Progress %lu \\n&quot;, argument-&gt;progress);         sleep(1);         if(argument-&gt;progress == 7) {             argument-&gt;errorCode = -1;         }     } } void loadData(void *arg) {     ThreadArg *argument = arg;     while(argument-&gt;progress &lt; 100) {         ++argument-&gt;progress;         sleep(1);         if(argument-&gt;errorCode == -1) {             pthread_cancel(pthread_self());         }     } } int main(int argc, const char *argv[]) {     pthread_t drawer, loader;     ThreadArg arg;     pthread_create(&drawer, nil, (void *(*)(void *)) drawProgress, &arg);     pthread_create(&loader, nil, (void *(*)(void *)) loadData, &arg);     pthread_join(loader, nil);     pthread_join(drawer, nil);     return 0; } <\/code><\/pre>\n<p>  \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0435\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 progress 8 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <b>pthread_cancel<\/b> \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u043c. \u0410 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>pthread_self<\/b> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043e\u0442\u043e\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430. \u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0446\u0438\u043a\u043b draw \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435. <\/p>\n<pre><code class=\"cpp\">void drawProgress(void *arg) {     ThreadArg *argument = arg;     while(argument-&gt;progress &lt; 100) {         printf(&quot;Progress %lu \\n&quot;, argument-&gt;progress);         sleep(1);         if(argument-&gt;progress == 7) { \/\/ c\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438             argument-&gt;errorCode = -1;             pthread_cancel(pthread_self()); \/\/ \u0441\u0430\u043c\u043e\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435         }     } } <\/code><\/pre>\n<p>  \u041d\u043e, \u0443\u0432\u044b, \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435:<\/p>\n<p>  Progress 0 <br \/>  Progress 1 <br \/>  Progress 3 <br \/>  Progress 4 <br \/>  Progress 4 <br \/>  Progress 5 <br \/>  Progress 6 <br \/>  Progress 8 <\/p>\n<p>  \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u043b\u0430\u0432\u043d\u043e. \u0414\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0434\u0438\u043d \u0438\u0437\u043c\u0435\u043d\u044f\u043b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0435\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u043b. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e condition variables.<\/p>\n<pre><code class=\"cpp\">pthread_mutex_t conditionMutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t condition = PTHREAD_COND_INITIALIZER; void drawProgress(void *arg) {     ThreadArg *argument = arg;     while(argument-&gt;progress &lt; 10) {         pthread_mutex_lock(&conditionMutex);          pthread_cond_wait(&condition, &conditionMutex);         printf(&quot;Progress %lu \\n&quot;, argument-&gt;progress);         pthread_mutex_unlock(&conditionMutex);      } } void loadData(void *arg) {     ThreadArg *argument = arg;     while(argument-&gt;progress &lt; 10) {         ++argument-&gt;progress;         pthread_cond_signal(&condition);         sleep(1);     } } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <b>pthread_cond_wait<\/b> \u0436\u0434\u0435\u0442, \u043f\u043e\u043a\u0430 \u043a\u0442\u043e-\u043b\u0438\u0431\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <b>pthread_cond_signal<\/b> \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e condition. \u0422.\u0435. \u044d\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u043d\u043e \u0431\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u0441 <b>pthread_cond_wait<\/b> \u043e\u0434\u043d\u043e\u0433\u043e condtion \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c dead lock. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u043e\u0434\u044f\u0442 \u043f\u0430\u0440\u0430\u043c\u0438 \u0441 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u043c.<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, loader-\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 \u043e\u0431\u0449\u0438\u0439 \u043c\u0435\u0448\u043e\u043a. \u0422.\u0435. \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0435\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u044f\u0447\u0435\u0439\u043a\u0443, \u0437\u0430\u0442\u0438\u0440\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0438\/\u0438\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0438 \u0431\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0434 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">#define threadsCount 3 #define arraySize 15 typedef struct {     size_t size;     size_t data[arraySize];     pthread_mutex_t mutex; } ThreadArray; typedef struct {     ThreadArray *array;     size_t ThreadId; } ThreadArgument; void loadData(void *arg) {     ThreadArgument *arg1 = arg;     ThreadArray *array = arg1-&gt;array;     size_t countToLoad = arraySize \/ threadsCount;     while(countToLoad) { \/\/        pthread_mutex_lock(&array-&gt;mutex);         array-&gt;data[array-&gt;size] = arg1-&gt;ThreadId;         ++array-&gt;size; \/\/        pthread_mutex_unlock(&array-&gt;mutex);         --countToLoad;         sleep(1);     }     free(arg1); } int main(int argc, const char *argv[]) {     pthread_t loaders[threadsCount];     size_t iterator;     ThreadArray *array = malloc(sizeof(ThreadArray)); \/\/    pthread_mutexattr_t attributes; \/\/    pthread_mutexattr_init(&attributes); \/\/    pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_NORMAL); \/\/    pthread_mutex_init(&array-&gt;mutex, &attributes);     array-&gt;size = 0;     for(iterator = 0; iterator &lt; threadsCount; ++iterator) {         ThreadArgument *arg = malloc(sizeof(ThreadArgument));         arg-&gt;array = array;         arg-&gt;ThreadId = iterator + 1;         pthread_create(&loaders[iterator], nil, (void *(*)(void *)) loadData, arg);     }     for(iterator = 0; iterator &lt; threadsCount; ++iterator) {         pthread_join(loaders[iterator], nil);     }     for(iterator = 0; iterator &lt; arraySize; ++iterator) {         printf(&quot;%lu &quot;, array-&gt;data[iterator]);     }     free(array);     return 0; } <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 0, \u0442\u043e \u043a\u043e\u0434 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432, \u0440\u0430\u0441\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>  \u041b\u044e\u0431\u043e\u0439 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0431\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u2013 <b>normal, recursive, error check<\/b>. \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u0445\u0432\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u043b\u0438 dead lock. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c n \u0440\u0430\u0437, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0439\u0434\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c n \u0440\u0430\u0437 (\u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c n \u0440\u0430\u0437 \u2013 dead lock), \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0442.\u043a. \u043f\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043e\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435. Error checking mutex \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <b>pthread_mutex_lock<\/b> \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u044c\u044e\u0442\u0435\u043a, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d, \u0435\u0441\u043b\u0438 \u0436\u0435 \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d, \u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0436\u0434\u0435\u0442 \u0435\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u0422.\u0435. \u0435\u0441\u043b\u0438 \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043e\u0434\u0438\u043d \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u0438\u0437-\u043d\u0438\u0445 \u0438\u0445 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0436\u0434\u0443\u0442, \u043f\u043e\u043a\u0430 \u0442\u043e\u0442, \u043a\u0442\u043e \u0435\u0433\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u043b, \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <b>pthread_mutex_unlock<\/b>. <\/p>\n<p>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%B5%D0%BA%D1%86%D0%B8%D1%8F\">\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0435\u0439<\/a>. \u0422.\u0435. \u043a\u043e\u0434\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0436\u0435 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b ( \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u0430\u043c\u0438), \u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e.<\/p>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u2013 \u043f\u0438\u0448\u0438\u0442\u0435.<\/p>\n<p>  P.S. \u041d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 \u043c\u043d\u0435 \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 <a href=\"https:\/\/github.com\/kojiba\/RayLanguage\">libRay<\/a> \u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0442\u0430\u043c \u0441\u0442\u0430\u043b\u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u043e\u043a\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c\u0438. <\/p>\n<h4>\u0427\u0443\u0434\u0435\u0441\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 (\u043d\u0430 \u0430\u043d\u0433\u043b \u044f\u0437\u044b\u043a\u0435)<\/h4>\n<p>  <a href=\"https:\/\/computing.llnl.gov\/tutorials\/pthreads\/#ConVarSignal\">computing.llnl.gov\/tutorials\/pthreads\/#ConVarSignal<\/a><br \/>  <a href=\"http:\/\/maxim.int.ru\/bookshelf\/PthreadsProgram\/htm\/r_28.html\">maxim.int.ru\/bookshelf\/PthreadsProgram\/htm\/r_28.html<\/a><br \/>  <a href=\"http:\/\/docs.oracle.com\/cd\/E19455-01\/806-5257\/6je9h032r\/index.html\">docs.oracle.com\/cd\/E19455-01\/806-5257\/6je9h032r\/index.html<\/a> \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/248651\/\"> http:\/\/habrahabr.ru\/post\/248651\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/4f5\/1b5\/273\/4f51b527318729061e92340a50335823.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0420\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u2013 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u0438\u0432\u0430\u0442\u0441\u044f, \u0442.\u0435. \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u0438\u043c\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. <\/p>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 GUI. GUI \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, loading screen \u2013 \u043e\u043d \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441, \u043f\u043e \u043c\u0435\u0440\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0418 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/dec\/bd2\/45a\/decbd245a1734ed186e86c618f49e4f9.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u0438 (threads). \u041f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0439 wrapper \u043d\u0430\u0434 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u041e\u0421, \u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 (\u043f\u0440\u0438\u0432\u0435\u0442, \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434). \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u043f\u043e\u0442\u043e\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"http:\/\/habrahabr.ru\/post\/40275\/\">\u00ab\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043d\u0438\u0442\u0438 (threads)?\u00bb<\/a> \u0438\u043b\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/164487\/\">\u00ab\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0432 Java\u00bb<\/a>. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u0438\u0441\u043a \u0432 \u043f\u043e\u043c\u043e\u0449\u044c. \u041d\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u041e\u0421 \u2013 POSIX threads.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-248651","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/248651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=248651"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/248651\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=248651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=248651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=248651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}