{"id":460611,"date":"2025-05-22T21:51:34","date_gmt":"2025-05-22T21:51:34","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=460611"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=460611","title":{"rendered":"<span>\u041b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c x86-64 assembler \u043f\u043e\u0441\u0432\u044f\u0449\u0430\u0435\u0442\u0441\u044f: DIY \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0432 C++<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0430\u0440\u0430 \u043c\u043e\u0438\u0445 \u0445\u0430\u0431\u0440\u043e\u0432\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 [<a href=\"https:\/\/habr.com\/ru\/articles\/902412\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d<\/a>, <a href=\"https:\/\/habr.com\/ru\/articles\/907312\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0432\u0430<\/a>] \u043f\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0434\u043b\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Intel_8086\" rel=\"noopener noreferrer nofollow\">8086<\/a> \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0430\u0436\u0438\u043e\u0442\u0430\u0436\u0430, \u043d\u043e \u043e\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e 5% <s>\u043f\u043e\u0442\u0435\u0440\u043f\u0435\u0432\u0448\u0438\u0445<\/s> \u043f\u043e\u0447\u0438\u0442\u0430\u0432\u0448\u0438\u0445 \u0436\u0435\u043b\u0430\u044e\u0442 \u043e\u0442\u0432\u0430\u0434\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430 \u043e\u0442 \u0448\u0435\u0432\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043b\u044c\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435.<\/p>\n<p>\u0418\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u043e \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0441\u044f 95% \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0430\u0432\u0442\u043e\u0440 \u0440\u0435\u0448\u0438\u043b\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e, \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e <strong>\u0432 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445<\/strong> &#171;\u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e&#187; \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0441 \u0436\u0434\u0451\u0442 \u043c\u043e\u0437\u0433\u043e\u0432\u044b\u043d\u043e\u0441\u044f\u0449\u0430\u044f \u0441\u043c\u0435\u0441\u044c 64\/32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e x86-\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e-\u0434\u043e\u0431\u0440\u043e\u0433\u043e C++.<\/p>\n<h2>\u0411\u0435\u0437\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0412\u0441\u0451 \u043d\u0438\u0436\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 &#8212; \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0432\u0442\u043e\u0440\u0430 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442. \u041f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u0441\u0432\u043e\u0451 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u043d\u0430 \u0441\u0435\u0431\u044f \u0440\u0438\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439. \u0426\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u0440\u0430 &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <a href=\"https:\/\/github.com\/galilov\/CoopMultitasking\" rel=\"noopener noreferrer nofollow\"><strong>\u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/strong><\/a>, \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443, \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0437\u0451\u0442, \u0441\u0443\u043c\u0435\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0443\u0442\u044c \u044f\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0443, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c &#171;\u043d\u0438\u0442\u044c&#187; (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">thread<\/a>) \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. \u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u043d\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0442\u044c \u0412\u0438\u043a\u0438, &#8212; \u044d\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u044f\u0434\u0440\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u043d\u0438\u0442\u0435\u0439 \u0437\u0430\u0432\u0435\u0434\u0443\u0435\u0442 \u044f\u0434\u0440\u043e \u041e\u0421. \u0410 \u043c\u044b, \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u0435\u043c \u044f\u0434\u0440\u0443, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0438\u0442\u044c\u044e. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u041e\u0421 \u0432\u043e\u043e\u0431\u0449\u0435 \u0443\u043c\u0435\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0432\u043e\u043b\u043e\u043a\u043d\u043e (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Fiber_(computer_science)\" rel=\"noopener noreferrer nofollow\">fiber<\/a>) &#8212; \u044d\u0442\u043e \u0435\u0449\u0451 \u043c\u0435\u043d\u044c\u0448\u0430\u044f, \u0447\u0435\u043c \u043d\u0438\u0442\u044c, \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f\u0434\u0440\u043e \u041e\u0421 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442. \u041d\u0438\u043a\u0430\u043a. \u0412\u043e\u043b\u043e\u043a\u043d\u0430 &#8212; \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u043a\u0430\u043a \u043d\u0438\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u043c, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 API. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043d\u0438\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u043b\u043e\u043a\u043e\u043d. \u041d\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u043b\u0436\u043d\u043e\u043c \u0443\u043c\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043b\u043b\u044e\u0437\u0438\u044e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0438\u0442\u0435\u0439 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044f\u0434\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c C++ \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/piter\/articles\/491996\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b<\/a>. \u0418\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0412\u043e\u043b\u043e\u043a\u043d\u0430 \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0442\u0430\u043a\u043e\u0432\u043e\u0439.<\/p>\n<p>Win32 API <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/procthread\/fibers\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u043c\u0438, <a href=\"https:\/\/www.boost.org\/doc\/libs\/1_88_0\/libs\/fiber\/doc\/html\/fiber\/overview.html\" rel=\"noopener noreferrer nofollow\">Boost::Fiber<\/a> &#8212; \u0442\u043e\u0436\u0435. \u041d\u043e, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u043c\u044b \u0438\u0434\u0451\u043c \u0441\u0432\u043e\u0438\u043c \u043f\u0443\u0442\u0451\u043c, \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0441\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043d\u044f\u0442\u044c \u0441\u0430\u043c\u0438\u043c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043c &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c&#187;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0438 <s>\u043f\u043e\u043b\u044e\u0431\u0438\u0442\u044c<\/s> \u043f\u043e\u043b\u0430\u0434\u0438\u0442\u044c \u0441 \u043d\u0438\u043c<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u044b\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c: \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0442\u0430\u043c <code>prologue<\/code>, <code>epilogue<\/code>, <code>invoke<\/code>, <code>stackframe<\/code>. \u0422\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0440, \u0442\u043e\u043b\u044c\u043a\u043e <code>mov rbp, rps<\/code> \u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a\u0430\u043a \u044f \u0441\u0430\u043c, <code>call<\/code> &#8212; \u0432\u0441\u0451 \u043a\u0430\u043a \u043c\u044b \u043b\u044e\u0431\u0438\u043c.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 <a href=\"https:\/\/visualstudio.microsoft.com\/ru\/downloads\/?cid=learn-onpage-download-install-visual-studio-page-cta\" rel=\"noopener noreferrer nofollow\"><strong>Microsoft Visual Studio 2022 Community<\/strong><\/a>, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0438 \u043d\u0430 <strong>2019<\/strong>. \u0421\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 <a href=\"https:\/\/github.com\/galilov\/CoopMultitasking\" rel=\"noopener noreferrer nofollow\"><strong>GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0430<\/strong><\/a>. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Visual Studio \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Assembler+C++ \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u0439 <a href=\"https:\/\/www.wikihow.com\/Use-MASM-in-Visual-Studio-2022\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/youtu.be\/zbOuzJkk4Fs\" rel=\"noopener noreferrer nofollow\">\u043a\u0438\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 <\/a>\u043e\u0442 <a href=\"https:\/\/www.youtube.com\/@dr.javaher\" rel=\"noopener noreferrer nofollow\">Dr. Nina Javaher<\/a>.<\/p>\n<h2>\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u043b\u043e\u043a\u043d\u0438\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 C\/C++<\/h2>\n<p><em>\u041f\u043e\u0447\u0442\u0438<\/em> \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<pre><code class=\"cpp\">void __stdcall fiber1(void* data) { for (auto i = 5; i &gt;= 0; --i) { std::cout &lt;&lt; \"+Fiber1:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; } }  void __stdcall fiber2(void* data) { for (auto i = 0; i &lt; 10; i++) { std::cout &lt;&lt; \"-Fiber2:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; } }  int main() { \/\/ register our fibers FiberManager::addFiber(fiber1, nullptr); FiberManager::addFiber(fiber2, nullptr); \/\/ run FiberManager::start(); \/\/ done std::cout &lt;&lt; \"***Exit***\" &lt;&lt; std::endl; return 0; }<\/code><\/pre>\n<p>\u0414\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0446\u0438\u043a\u043b\u044b \u0432 \u043d\u0438\u0445. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0442 5 \u0434\u043e 0 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0442 0 \u0434\u043e 9 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c&#8230;<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eea\/9da\/d4c\/eea9dad4ccffd3783e0b98b95d58a445.png\" alt=\"\u0420\u0438\u0441. 1. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e\" title=\"\u0420\u0438\u0441. 1. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e\" width=\"1212\" height=\"806\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eea\/9da\/d4c\/eea9dad4ccffd3783e0b98b95d58a445.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eea\/9da\/d4c\/eea9dad4ccffd3783e0b98b95d58a445.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 1. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u0448\u0451\u043b \u0447\u0435\u043c \u0443\u0434\u0438\u0432\u0438\u0442\u044c! \u0410\u0432\u0442\u043e\u0440, \u0442\u044b \u0447\u0435\u043c \u0442\u0430\u043c \u043e\u0431\u044a\u0435\u043b\u0441\u044f?! \u0412\u0438\u0434\u043d\u043e \u0436\u0435, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <code>fiber1<\/code>, \u043f\u043e\u0442\u043e\u043c <code>fiber2<\/code>. \u0414\u0438\u0437\u043b\u0430\u0439\u043a \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u043a\u0430\u043a\u0430\u0448\u043a\u0430 \u0432 \u043a\u0430\u0440\u043c\u0443!<\/p>\n<p>\u0418\u0437\u0432\u0438\u043d\u0438, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u044f \u0437\u0430\u0431\u044b\u043b \u043a\u043e\u0435-\u0447\u0442\u043e, \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0448\u0430\u0433&#8230;<\/p>\n<pre><code class=\"cpp\">void __stdcall fiber1(void* data) { for (auto i = 5; i &gt;= 0; --i) { std::cout &lt;&lt; \"+Fiber1:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; yield(); \/\/ one small step for man... } }  void __stdcall fiber2(void* data) { for (auto i = 0; i &lt; 10; i++) { std::cout &lt;&lt; \"-Fiber2:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; yield(); \/\/ ...one giant leap for mankind } }  int main() { \/\/ register our fibers FiberManager::addFiber(fiber1, nullptr); FiberManager::addFiber(fiber2, nullptr); \/\/ run FiberManager::start(); \/\/ done std::cout &lt;&lt; \"***Exit***\" &lt;&lt; std::endl; return 0; }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>yield()<\/code>:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e8\/e31\/4ba\/2e8e314bac38e596887d19270f34f83f.png\" alt=\"\u0420\u0438\u0441. 2. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f &quot;\u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438&quot; \u0432\u043e\u043b\u043e\u043a\u043e\u043d\" title=\"\u0420\u0438\u0441. 2. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f &quot;\u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438&quot; \u0432\u043e\u043b\u043e\u043a\u043e\u043d\" width=\"1212\" height=\"806\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2e8\/e31\/4ba\/2e8e314bac38e596887d19270f34f83f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e8\/e31\/4ba\/2e8e314bac38e596887d19270f34f83f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 2. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f &#171;\u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438&#187; \u0432\u043e\u043b\u043e\u043a\u043e\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0438\u043c\u0441\u044f \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <strong>\u0447\u0435\u0440\u0435\u0434\u0443\u0435\u0442\u0441\u044f<\/strong>.<\/p>\n<p>-\u0422\u0430\u043a&#8230; \u044d\u0442\u043e \u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043d\u0438\u0442\u0438! \u0410\u0432\u0442\u043e\u0440, \u0432\u0441\u0451, \u043e\u0442\u043f\u0438\u0441\u043a\u0430!<br \/>-\u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435 \u043d\u0438\u0442\u0438. \u042f \u0436\u0435 \u043d\u0435 \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u043e \u0442\u0430\u043c \u0432\u044b\u0432\u043e\u0436\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Win32 API <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/processthreadsapi\/nf-processthreadsapi-getcurrentthreadid\" rel=\"noopener noreferrer nofollow\"><code>GetCurrentThreadId()<\/code><\/a>. \u041f\u043e Thread ID \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0438\u0442\u0438 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f&#8230;<\/p>\n<h2>\u041a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f fibers<\/h2>\n<p><strong>\u041a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u0445<\/strong> &#8212; \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430 (fiber) \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0438\u043b\u0438 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0430\u0448\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>yield()<\/code>. <strong>\u0412\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 user space<\/strong> \u0438, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043d\u0438\u0442\u0435\u0439, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432.<\/p>\n<p>\u041a <strong>\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c<\/strong> fibers \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 user space \u0438 kernel space, \u043d\u043e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 &#171;\u043e\u0442\u0434\u0430\u0447\u0438&#187; \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u044f\u0433\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u043e\u043d\u043a\u0438<\/a> (race condition). \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0433\u043e\u043d\u043a\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>yield()<\/code> \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u0412\u043d\u0443\u0442\u0440\u0438 <code>yield()<\/code> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 <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\" rel=\"noopener noreferrer nofollow\">\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438<\/a> \u0434\u043b\u044f \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430.<\/p>\n<p>\u041a <strong>\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c<\/strong> \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0439\u043d\u044e\u044e \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Win32 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/synchapi\/nf-synchapi-sleep\" rel=\"noopener noreferrer nofollow\"><code>Sleep(milliseconds)<\/code><\/a> &#171;\u043f\u043e\u0432\u0435\u0441\u0438\u0442&#187; \u0432\u0441\u044e \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>mySleep<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Win32 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/sysinfoapi\/nf-sysinfoapi-gettickcount64\" rel=\"noopener noreferrer nofollow\"><code>GetTickCount64()<\/code><\/a>:<\/p>\n<pre><code class=\"cpp\">void mySleep(uint32_t milliseconds) { \/\/ Retrieve the number of milliseconds that have elapsed since the system was started. \/\/ See https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/sysinfoapi\/nf-sysinfoapi-gettickcount64 ULONGLONG t = GetTickCount64(); while (GetTickCount64() &lt; t + milliseconds) { yield(); } }<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>mySleep(uint32_t milliseconds)<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0451 \u0432\u044b\u0437\u0432\u0430\u043b\u043e, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0442.\u043a. &#171;\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443&#187; \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield()<\/code>, \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u0432\u043e\u0438\u043c \u0441\u043e\u0441\u0435\u0434\u044f\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">void __stdcall fiber1(void* data) { for (auto i = 5; i &gt;= 0; --i) { std::cout &lt;&lt; \"+Fiber1:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; mySleep(300); } }  void __stdcall fiber2(void* data) { for (auto i = 0; i &lt; 10; i++) { std::cout &lt;&lt; \"-Fiber2:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; mySleep(100); } }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>mySleep()<\/code> \u0443\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield()<\/code>, \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u044f\u0432\u043d\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043c\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0443. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<pre><code>+Fiber1:10140 5 -Fiber2:10140 0 -Fiber2:10140 1 -Fiber2:10140 2 +Fiber1:10140 4 -Fiber2:10140 3 -Fiber2:10140 4 -Fiber2:10140 5 +Fiber1:10140 3 -Fiber2:10140 6 +Fiber1:10140 2 -Fiber2:10140 7 -Fiber2:10140 8 -Fiber2:10140 9 +Fiber1:10140 1 +Fiber1:10140 0 ***Exit*** <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u0445 \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">std::string myReadString() { std::string result; for (;;) { if (_kbhit()) { char c = static_cast&lt;char&gt;(_getch_nolock()); if (c == '\\r') { break; } _putch_nolock(c); result += c; } yield(); } return result; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/getch-nolock-getwch-nolock?view=msvc-170\" rel=\"noopener noreferrer nofollow\"><code>_getch_nolock()<\/code><\/a> \u0438 <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/getch-nolock-getwch-nolock?view=msvc-170\" rel=\"noopener noreferrer nofollow\"><code>_putch nolock()<\/code><\/a> &#8212; \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0432 <code>conio.h<\/code>.<\/p>\n<p>\u0421\u0430\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0433\u0434\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0430\u0447\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043d\u0438\u0442\u044f\u043c \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c. \u041d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u043c: \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e, \u0432\u044b\u0437\u043e\u0432 <code>yield()<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432 \u043e\u0431\u0435\u0440\u0442\u043a\u0430\u0445 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 <code>poll()<\/code>\/<code>select()<\/code> \u0438 \u0434\u0430\u043b\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0437 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0441 \u0441\u0435\u0442\u044c\u044e \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h2>\u0423 \u043c\u0435\u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0435&#8230; \u0433\u043c&#8230; \u043d\u0435\u043e\u043d\u043a\u0430<\/h2>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8212; \u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0438\u0447\u0435\u0433\u043e  \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u0430\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442  \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0440\u043e\u0435&#8230;<\/p>\n<p>&#8212; \u0412\u043d\u0443\u0442\u0440\u0435! &#8212; \u043f\u0440\u043e\u0448\u0435\u043b\u0435\u0441\u0442\u0435\u043b  \u0441\u0442\u0430\u0440\u0438\u0447\u043e\u043a. &#8212; \u0412\u043d\u0443\u0442\u0440\u0435  \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0433\u0434\u0435 \u0443 \u043d\u0435\u0451 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u0434\u0443\u043c\u0430\u0442\u0435\u043b\u044c&#8230;<\/p>\n<p>&#8212; \u0410\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440&#8230; &#8212;  \u0441\u043a\u0430\u0437\u0430\u043b  \u044f. &#8212; \u041d\u0435\u0442  \u0437\u0434\u0435\u0441\u044c  \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430. \u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u0432\u044b\u043f\u0440\u044f\u043c\u0438\u0442\u0435\u043b\u044c &#8212;  \u0435\u0441\u0442\u044c, \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u0440\u0438\u043d\u043d\u044b\u0439. \u041d\u0435\u043e\u043d\u043e\u0432\u0430\u044f  \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f. <strong>\u0422\u0443\u043c\u0431\u043b\u0435\u0440<\/strong>. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u0443\u043c\u0431\u043b\u0435\u0440, \u043d\u043e\u0432\u044b\u0439. \u0422\u0430-\u0430\u043a&#8230; \u0415\u0449\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0448\u043d\u0443\u0440. \u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0448\u043d\u0443\u0440, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u044b\u0439&#8230; \u0412\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0438 \u0432\u0441\u0451.<\/p>\n<p>&#8212; \u0410p\u043a\u0430\u0434\u0438\u0439 \u0421\u0442\u0440\u0443\u0433\u0430\u0446\u043a\u0438\u0439, \u0411\u043ep\u0438\u0441 \u0421\u0442\u0440\u0443\u0433\u0430\u0446\u043a\u0438\u0439.<br \/>&#171;\u0421\u043a\u0430\u0437\u043a\u0430 \u043e \u0422p\u043e\u0439\u043a\u0435&#187;<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u044b \u0441 \u0434\u0435\u0442\u0441\u0442\u0432\u0430 \u043b\u044e\u0431\u0438\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0412\u043e\u0442 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0420\u0438\u0441. 3):<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e98\/a07\/6ae\/e98a076aeeed761775a6280eec50536a.png\" alt=\"\u0420\u0438\u0441. 3. \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u043b\u043e\u043a\u043e\u043d.\" title=\"\u0420\u0438\u0441. 3. \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u043b\u043e\u043a\u043e\u043d.\" width=\"1138\" height=\"1078\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e98\/a07\/6ae\/e98a076aeeed761775a6280eec50536a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e98\/a07\/6ae\/e98a076aeeed761775a6280eec50536a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 3. \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u043b\u043e\u043a\u043e\u043d.<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c, \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 \u043c\u043e\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/907312\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/a>, \u044d\u0442\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u043d\u0438\u0442\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u0417\u0434\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield()<\/code> \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0435.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 <code>yield()<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 Fiber manager, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 <code>esp<\/code>\/<code>rsp<\/code>  \u043d\u0430 \u0441\u0442\u0435\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>RET<\/code> \u0432 \u044d\u0442\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u043e\u043b\u043e\u043a\u043d\u0435 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043c <code>yield()<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 \u0441\u0432\u043e\u0451\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>yield()<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<blockquote>\n<p>\u041c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041e\u0441\u043e\u0431\u043d\u044f\u043a\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e Fiber Manager \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u043c\u0443 \u0441\u0432\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043a, \u0432 \u0447\u0438\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0438\u0445 \u0432\u0435\u0449\u0435\u0439, <strong>\u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u0430<\/strong>  <code>onFiberFinished()<\/code> \u0438 <strong>\u0430\u0434\u0440\u0435\u0441 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043e\u043b\u043e\u043a\u043d\u0430<\/strong>. \u0421\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>yield()<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0437 Main code &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 Fiber manager, \u0442\u043e\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0441\u0430\u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 <code>esp<\/code>\/<code>rsp<\/code> \u0430\u0434\u0440\u0435\u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>RET<\/code>. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043a\u043e\u0434 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 &#8212; \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a. \u0414\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u0438\u0434\u0451\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435: \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>yield()<\/code> \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 Fiber Manager, \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/blockquote>\n<p>\u0412\u043e\u043b\u043e\u043a\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441. 3 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0437\u0435\u043b\u0451\u043d\u044b\u043c \u0438 \u0440\u043e\u0437\u043e\u0432\u044b\u043c (\u043b\u0430\u0434\u043d\u043e, \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u043e\u0437\u043e\u0432\u044b\u0439, \u0430 \u043d\u0435 \u043c\u0430\u0434\u0436\u0435\u043d\u0442\u0430). \u041f\u0440\u0435\u0440\u044b\u0432\u0438\u0441\u0442\u043e\u0441\u0442\u044c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0438\u0441\u0442\u043e, \u0432 \u0432\u0438\u0434\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u0436\u0438\u0437\u043d\u0438. \u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u043d\u0435\u0451 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435, \u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442. Fiber manager, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0443, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0432 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u043c\u0438.<\/p>\n<blockquote>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0438\u0448\u043d\u044b\u0439 <code>return<\/code>, \u0442\u043e \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u043d\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>RET<\/code>. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>onFiberFinished()<\/code> \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0439 Fiber manager. \u042d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u0432\u043e\u043b\u043e\u043a\u043e\u043d. \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442, \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>esp<\/code>\/<code>rsp<\/code> \u043d\u0430 \u0441\u0442\u0435\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (Main code \u043d\u0430 \u0440\u0438\u0441. 3) \u0438, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430,  \u043e\u0442\u0434\u0430\u0451\u0442 \u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/blockquote>\n<h2>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/h2>\n<h3>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u0430<\/h3>\n<p>\u0412\u0435\u0441\u044c\u043c\u0430 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>addFiber<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 <code>FiberDescriptor<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>fiber<\/code> \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 <code>data<\/code>. \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043b\u043e\u043a\u043e\u043d  <code>_fibers<\/code>:<\/p>\n<pre><code class=\"cpp\">namespace FiberManager { typedef std::unique_ptr&lt;FiberDescriptor&gt; FiberDescritporPtr; typedef std::list&lt;FiberDescritporPtr&gt; Descriptors;  Descriptors _fibers; FiberDescritporPtr _finishedFiber; Descriptors::iterator _itFiber; \/\/ points to a current fiber  void addFiber(void(__stdcall* fiber)(void*), void* data) { _fibers.emplace_back(std::make_unique&lt;FiberDescriptor&gt;(fiber, data)); } . . . .<\/code><\/pre>\n<h3>\u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0432\u043e\u043b\u043e\u043a\u043d\u0430<\/h3>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 <code>FiberDescriptor<\/code>:<\/p>\n<pre><code class=\"cpp\">#ifdef _M_X64 typedef uint64_t MemAddr; #else typedef uint32_t MemAddr; #endif class FiberDescriptor { public: static constexpr size_t nStackEntries = 16384; FiberDescriptor(const FiberDescriptor&amp;) = delete; FiberDescriptor&amp; operator=(const FiberDescriptor&amp;) = delete; FiberDescriptor(void(__stdcall* fiber)(void*), void* data); bool isOwnerOfStack(const MemAddr* sp) { return (sp &gt;= &amp;_stack[0]) &amp;&amp; (sp &lt; &amp;_stack[0] + nStackEntries); } void saveStackPointer(MemAddr* sp) { _stackPointer = sp; } MemAddr* getStackPointer() const { return _stackPointer; } private: MemAddr _stack[nStackEntries]; MemAddr* _stackPointer; };<\/code><\/pre>\n<p>\u041f\u043e\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445: <\/p>\n<ul>\n<li>\n<p>\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>_stack <\/code>\u0436\u0438\u0432\u0451\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16384 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 4 \u0431\u0430\u0439\u0442\u0430 \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0438\u043b\u0438 8 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e. \u0421\u0442\u0435\u043a \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 (<code>call<\/code>) \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u0432 (<code>ret<\/code>) \u0438\u0437 \u043d\u0438\u0445. \u0422\u0443\u0442 \u0432\u0441\u0451 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0443 \u043d\u0438\u0442\u0435\u0439, \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0441\u0432\u043e\u0439 \u0441\u0442\u0435\u043a. \u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u044b\u0431\u0440\u0430\u043d \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043f\u043e\u043b\u0435 <code>_stackPointer <\/code>\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 <code>esp<\/code>\/<code>rsp<\/code> \u043d\u0430 \u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>FiberDescriptor(void(__stdcall* fiber)(void*), void* data)<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fiber<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>nullptr<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p><code>bool isOwnerOfStack(const MemAddr* sp)<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>sp<\/code>, \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a \u0441\u0442\u0435\u043a\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0430. \u041c\u0435\u0442\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>yield()<\/code> \u0438\u0437 Main code \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>_mainSp<\/code> \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 <code>yield()<\/code> \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0432\u043e\u043b\u043e\u043a\u043e\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0434\u0435\u043b\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0432\u043e\u043b\u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">#include \"FiberDescriptor.h\"  extern \"C\" MemAddr* lowLevelEnqueueFiber(void(__stdcall*)(void*), void*, MemAddr*); \/\/ defined in .asm  FiberDescriptor::FiberDescriptor(void(__stdcall* fiber)(void*), void* data) { \/\/ fill the stack with pre-defined pattern for (auto&amp; elem : _stack) { #ifdef _M_X64 elem = 0xdeadbeeff00da011ULL; \/\/ DeadBeefFoodA0ll for debug #else elem = 0xdeadbeefU; \/\/ DeadBeef for debug #endif } _stackPointer = lowLevelEnqueueFiber(fiber, data, &amp;_stack[0] + nStackEntries); }<\/code><\/pre>\n<ul>\n<li>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0441\u0442\u0435\u043a\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Win32 API. \u0427\u0430\u0441\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0437\u0430\u0442\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u043b\u043e\u043a\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>MemAddr* lowLevelEnqueueFiber(void(__stdcall*)(void*), void*, MemAddr*)<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435. \u041e\u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0435\u043a \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u0432\u0442\u043e\u0440 \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0432\u044b \u043c\u0435\u0447\u0442\u0430\u043b\u0438 \u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0438 \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u0432 64 \u0431\u0438\u0442\u0430 \u0448\u0438\u0440\u0438\u043d\u043e\u0439, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0411\u0443\u0434\u0435\u0442 \u0438 64 \u0431\u0438\u0442\u0430, \u043d\u043e \u043d\u0430\u0447\u043d\u0451\u043c \u043c\u044b \u0441 32 \u0431\u0438\u0442. \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 x86-32 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>lowLevelEnqueueFiber<\/code>:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Should be used from MAIN context to add a new fiber to fiber dispatcher. ; returns new stack pointer in eax ; extern \"C\" MemAddr* lowLevelEnqueueFiber(void(__stdcall*)(void*), void*, MemAddr*); lowLevelEnqueueFiber PROC    ;pFunc:PTR, pData:PTR, pStack:PTR     push    ebp     mov     ebp, esp     mov     esp, [ebp + 10h] ; pStack - prepare the top of stack for a new fiber     push    [ebp + 0Ch]      ; pData - points to void* parameter will passed to the fiber via stack     push    onFiberFinished  ; the handler which is called at the fiber completion stage     push    [ebp + 08h]      ; pFunc = pointer to a fiber function     ; allocate stack space to popping edi, esi, ebx, ebp in lowLevelResume()     push    0     push    0     push    0     push    0     mov     eax, esp    ; the result is the address of the new fiber's stack pointer in eax.     mov     esp, ebp    ; restore esp     pop     ebp         ; restore ebp     ret lowLevelEnqueueFiber ENDP<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u043a\u0440\u043e \u0448\u0442\u0443\u0447\u0435\u043a \u043e\u0442 MASM. \u0422\u0443\u0442 \u0434\u0430\u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>enter<\/code>\/<code>leave<\/code> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0443\u0449\u0435\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e\u0431 enter\/leave<\/summary>\n<div class=\"spoiler__content\">\n<p><code>ENTER op1,op2<\/code><\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 ENTER \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u0434\u0440 \u0441\u0442\u0435\u043a\u0430, \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u0437\u0430\u0434\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0431\u0430\u0439\u0442\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u0432 \u0441\u0442\u0435\u043a\u0435 \u043f\u0440\u0438 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443. \u0412\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u0437\u0430\u0434\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u044f\u0437\u044b\u043a\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440 \u0441\u0442\u0435\u043a\u0430 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e. \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 16 \u0431\u0438\u0442\u0430\u043c, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 BP \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 SP \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 32 \u0431\u0438\u0442\u0430\u043c, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b EBP \u0438 ESP \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <strong>\u0430 \u0432 64-\u0431\u0438\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 RBP \u0438 RSP<\/strong>. <em>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a:<\/em> <a href=\"https:\/\/sysprog.ru\/post\/komandy-enter-leave\" rel=\"noopener noreferrer nofollow\">https:\/\/sysprog.ru\/post\/komandy-enter-leave<\/a><\/p>\n<p>\u041f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438 ENTER X, 0 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"assembly\">push   ebp mov    ebp, esp sub    esp, X<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0441\u043e\u0431\u043e \u043f\u044b\u0442\u043b\u0438\u0432\u044b\u0445 \u0432\u043e\u0442 <a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20231211-00\/?p=109126\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c <\/a>\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 ENTER.<\/p>\n<p><code>LEAVE<\/code><\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 LEAVE \u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 ENTER. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 LEAVE \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 EBP \u0432 ESP, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0432\u0435\u0441\u044c \u043a\u0430\u0434\u0440, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 ENTER, \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 EBP \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. <em>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a:<\/em> <a href=\"https:\/\/sysprog.ru\/post\/komandy-enter-leave\" rel=\"noopener noreferrer nofollow\">https:\/\/sysprog.ru\/post\/komandy-enter-leave<\/a><\/p>\n<p>\u041d\u0430 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u043d\u0430\u043c \u044f\u0437\u044b\u043a\u0435 LEAVE \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"assembly\">mov    esp, ebp pop    ebp<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>lowLevelEnqueueFiber<\/code>, \u0432 \u0441\u0442\u0435\u043a\u0435, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/learn.microsoft.com\/ru-ru\/cpp\/cpp\/cdecl?view=msvc-170\" rel=\"noopener noreferrer nofollow\">ABI \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e __cdecl<\/a> \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>pFunc<\/code> (\u043e\u043d \u0436\u0435 fiber), <code>pData<\/code>, <code>pStack<\/code> \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 <code>esp<\/code>. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0445\u043e\u0434\u0430 \u0432 <code>lowLevelEnqueueFiber<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>esp<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043a\u0430 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443. \u042d\u0442\u043e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c <code>0<\/code>. \u0421\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>4<\/code> \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u043e\u043b\u043e\u043a\u043d\u043e <code>pFunc<\/code>, \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>8<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c pData, \u0438 \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>12<sub>dec<\/sub><\/code> \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <code>pStack<\/code>.<\/p>\n<p>\u041d\u043e \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u043d\u043e\u0435: \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0435\u043a\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>ebp<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043a\u043e\u043f\u0438\u044e <code>esp<\/code>, \u043d\u043e \u0432\u0441\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u044b \u043d\u0430 <code>4<\/code>. \u0412 \u0447\u0451\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430? \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0442\u043e\u043b\u043a\u0430\u043b\u0438 \u0432 \u0441\u0442\u0435\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 <code>ebp<\/code>, \u043f\u043e\u0442\u043e\u043c \u0441\u0434\u0435\u043b\u0430\u043b\u0438 <code>mov ebp, esp<\/code> \u0438 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0410 \u0437\u0430\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 <code>esp<\/code> \u043d\u0430 <code>4<\/code>.<\/p>\n<p>\u0417\u0430\u0447\u0435\u043c \u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0432 \u0441\u0442\u0435\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>ebp<\/code>? \u0417\u0430\u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 <code>lowLevelEnqueueFiber<\/code>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e \u0441\u0442\u0435\u043a. \u0410 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0438\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>ebp<\/code>\/<code>rbp<\/code>:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/069\/214\/406\/06921440691fd395714ab339831aa690.png\" alt=\"\u0420\u0438\u0441. 5. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430 C \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 Visual Studio 2022.\" title=\"\u0420\u0438\u0441. 5. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430 C \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 Visual Studio 2022.\" width=\"463\" height=\"110\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/069\/214\/406\/06921440691fd395714ab339831aa690.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/069\/214\/406\/06921440691fd395714ab339831aa690.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 5. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430 C \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 Visual Studio 2022.<\/figcaption><\/div>\n<\/figure>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/medium.com\/@sruthk\/cracking-assembly-accessing-local-variables-in-x86-vs-x64-eb018ce1ef2a\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043b\u0438\u0431\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <code>ebp<\/code> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0435\u0433\u043e. \u0423 \u043d\u0430\u0441 <code>ebp<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043f\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>esp<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0438\u0436\u0435 \u043f\u043e \u043a\u043e\u0434\u0443 <code>lowLevelEnqueueFiber<\/code> \u043c\u0435\u043d\u044f\u0435\u043c:<\/p>\n<pre><code class=\"assembly\">mov     esp, [ebp + 10h] ; pStack - prepare the top of stack for a new fiber<\/code><\/pre>\n<p>\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0438\u0437 <code>ebp<\/code> \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u0432\u0430\u043b <code>lowLevelEnqueueFiber<\/code>.<\/p>\n<p>\u0422\u0430\u043a \u0441 \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 \u0446\u0435\u043b\u044c\u044e \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c <code>esp<\/code>? \u0426\u0435\u043b\u044c \u043d\u0430\u0448\u0430 \u0441\u0443\u0433\u0443\u0431\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0430 \u0438 \u0431\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u043d\u0430! \u0412 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>esp<\/code> \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0432\u0435\u0436\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0435\u043a \u0432\u043e\u043b\u043e\u043a\u043d\u0430. <\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 <code>lowLevelEnqueueFiber<\/code> \u0438\u0437 C++:<\/p>\n<pre><code class=\"cpp\">_stackPointer = lowLevelEnqueueFiber(fiber, data, &amp;_stack[0] + nStackEntries);<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u0442\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>&amp;_stack[0] + nStackEntries<\/code>. \u0412\u043e\u0442 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0442\u0435\u043a \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u043d\u0438\u0437&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8230;\u043e\u0442 \u0431<em>\u043e<\/em>\u043b\u044c\u0448\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043a \u043c\u0435\u043d\u044c\u0448\u0438\u043c. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <strong>\u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435<\/strong> <code>esp<\/code> \u043d\u0430 <code>4<\/code> (\u0432 64-\u0431\u0438\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>rsp<\/code> \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <code>8<\/code>), \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0447\u0442\u043e, \u0442\u0443\u0442 \u0432\u0441\u0451 \u0432\u0435\u0440\u043d\u043e.*<\/p>\n<p>*) \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0435 &#171;\u043d\u0430 4&#187; \u0438\u043b\u0438 &#171;\u043d\u0430 8&#187;, \u0430 &#171;\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u0441\u0442\u0435\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430&#187;. \u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0443\u0434\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0430 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043a \u0440\u0430\u0437 4 \u0438 8 \u0431\u0430\u0439\u0442 \u0434\u043b\u044f 32- \u0438 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0435\u043a \u043c\u044b \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0437\u0430\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u0430 <code>onFiberFinished<\/code>, \u0430\u0434\u0440\u0435\u0441 \u0441\u0430\u043c\u043e\u0439 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>lowLevelEnqueueFiber<\/code>, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>ebp + 08h<\/code> \u0438 \u0435\u0449\u0451 <code>4<\/code> \u043d\u0443\u043b\u044f. \u0412\u043e\u0442 \u044d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a:<\/p>\n<pre><code class=\"assembly\">    push    onFiberFinished  ; the handler which is called at the fiber completion stage     push    [ebp + 08h]      ; pFunc = pointer to a fiber function     ; allocate stack space to popping edi, esi, ebx, ebp in lowLevelResume()     push    0     push    0     push    0     push    0<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0441\u0442\u0435\u043a. \u0421\u043a\u043e\u0440\u043e \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0441\u043c\u044b\u0441\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439.<\/p>\n<p>\u0410 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043a\u043e\u0434\u0443 <code>lowLevelEnqueueFiber<\/code> \u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>esp<\/code>, \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a \u0432\u0441\u0435\u0445 \u043d\u0443\u0436\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0438 \u043d\u0443\u043b\u0435\u0439, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 <code>eax<\/code>:<\/p>\n<pre><code class=\"assembly\">mov     eax, esp    ; the result is the address of the new fiber's stack pointer in<\/code><\/pre>\n<blockquote>\n<p>\u0412 C\/C++ \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0438 cdecl \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <a href=\"https:\/\/en.wikibooks.org\/wiki\/X86_Assembly\/High-Level_Languages#CDECL\" rel=\"noopener noreferrer nofollow\"><code>eax<\/code>\/<code>rax<\/code><\/a>.<\/p>\n<\/blockquote>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u0434 \u0443\u0445\u043e\u0434\u043e\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <code>esp<\/code> \u0438 \u0432\u044b\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>ebp<\/code> \u0447\u0442\u043e\u0431\u044b <s>\u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0431\u0438\u0434\u0435\u043b\u0441\u044f<\/s> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043f\u0430\u043b\u043e:<\/p>\n<pre><code class=\"assembly\">    mov     eax, esp    ; the result is the address of the new fiber's stack pointer in eax.     mov     esp, ebp    ; restore esp     pop     ebp         ; restore ebp     ret<\/code><\/pre>\n<p>\u0423\u0444\u0444&#8230; \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u044f \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u043b&#8230; \u0430\u0445 \u0434\u0430, \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0443\u043b\u044f \u0432 \u0441\u0442\u0435\u043a\u0435! \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0442 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0435\u0451 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438-\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c: \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>yield()<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0430 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c, \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c\u0438 \u043d\u0435 \u043d\u0430\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0412 \u0447\u0438\u0441\u043b\u0435 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043b\u0438\u0431\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043b\u0438\u0431\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445. \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0432\u0435\u0434\u044c \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e, \u0430 <code>yield()<\/code> \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u043c\u0438.<\/p>\n<blockquote>\n<p>\u0412\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430: <code>EBX<\/code>, <code>EBP<\/code>, <code>ESP<\/code>, <code>EDI<\/code>, <code>ESI<\/code>, <code>CS<\/code>, <code>DS<\/code>.<\/p>\n<\/blockquote>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0434\u043b\u044f Windows (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 Flat, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <code>CS<\/code> \u0438 <code>DS<\/code> \u043d\u0438\u043a\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0438 \u0441\u0430\u043c\u0438 \u043c\u044b \u0438\u0445 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c. \u0420\u0435\u0433\u0438\u0441\u0442\u0440 <code>ESP<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u043d\u0430\u0448\u0438\u043c \u0447\u0443\u0442\u043a\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0438 \u043c\u044b \u0441\u0442\u0440\u043e\u0433\u043e \u0431\u0434\u0438\u043c \u0437\u0430 \u0435\u0433\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u0432\u043e\u0442 <code>EBX<\/code>, <code>ESI<\/code>, <code>EDI<\/code>, <code>EBP<\/code> \u043c\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0432 \u0438\u0445 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 <code>yield()<\/code>. \u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u043e\u043b\u043e\u043a\u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0423\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0432 \u0441\u0442\u0435\u043a\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 <code>PUSH<\/code>, \u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0445 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 <code>POP<\/code>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0435\u043a \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0431\u044b\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0432 \u043d\u0435\u0433\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442.\u043a. \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0435 \u0432\u0430\u0436\u043d\u044b.<\/p>\n<h3>\u0421\u0442\u0430\u0440\u0442!<\/h3>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0431\u043b\u0438\u0436\u0435 \u043d\u0430 \u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>void start()<\/code> \u0432 Fiber manager:<\/p>\n<pre><code class=\"cpp\">\/\/ Pointer to MAIN stack static MemAddr* _mainSp;  namespace FiberManager { typedef std::unique_ptr&lt;FiberDescriptor&gt; FiberDescritporPtr; typedef std::list&lt;FiberDescritporPtr&gt; Descriptors;  Descriptors _fibers; FiberDescritporPtr _finishedFiber; Descriptors::iterator _itFiber; \/\/ points to a current fiber  void addFiber(void(__stdcall* fiber)(void*), void* data) { _fibers.emplace_back(std::make_unique&lt;FiberDescriptor&gt;(fiber, data)); }  void start() { _mainSp = nullptr; _itFiber = _fibers.begin(); \/\/ Select the first fiber \/\/ Run the first fiber from MAIN stack context. \/\/ The stack will be switched to a local fiber-related stack. yield(); \/\/ it returns back to start() when all the fibers will finish. _finishedFiber.reset(); } }<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0442\u0430\u043c &#8212; \u0432\u044b\u0437\u043e\u0432 <code>yield()<\/code>. \u042d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0438 \u0432\u0435\u0440\u043d\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>yield()<\/code> \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430:<\/p>\n<pre><code class=\"assembly\">; void yield() is used to switch the fiber. Should be called from running fiber. ; It is also used to run the initial fiber from main context yield PROC     pushall             ; save non-volatile registers     push    esp         ; pass a stack pointer to fiberManagerYield as argument     ; fiberManagerYield(sp) switches the execution to another fiber     call    fiberManagerYield     add     esp, 4      ; release one stacked parameter passed to fiberManagerYield     popall              ; restore non-volatile registers     ret yield ENDP<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043a\u0440\u043e\u043a\u043e\u043c\u0430\u043d\u0434\u044b pushall \u0438 popall \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\/\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442 \u0432\/\u0438\u0437 \u0441\u0442\u0435\u043a\u0430 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>32-\u0431\u0438\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; See https:\/\/www.agner.org\/optimize\/calling_conventions.pdf and ; https:\/\/learn.microsoft.com\/en-us\/cpp\/cpp\/cdecl?view=msvc-160 ; Non-vloatile registers are EBX, EBP, ESP, EDI, ESI, CS and DS pushall macro     push    ebx     push    esi     push    edi     push    ebp     endm ;---------------------------------------------------------------------------- ; See https:\/\/www.agner.org\/optimize\/calling_conventions.pdf and ; https:\/\/learn.microsoft.com\/en-us\/cpp\/cpp\/cdecl?view=msvc-160 ; Non-vloatile registers are EBX, EBP, ESP, EDI, ESI, CS and DS popall  macro     pop     ebp     pop     edi     pop     esi     pop     ebx     endm ;----------------------------------------------------------------------------<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>yield()<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0442\u0435\u043a\u0435, \u0437\u0430\u0442\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 C-\u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>void fiberManagerYield(MemAddr*)<\/code> .<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>fiberManagerYield<\/code>:<\/p>\n<pre><code class=\"cpp\">\/\/ This function is called from ASM code yield(). \/\/ @param sp - current stack pointer after all the required CPU  \/\/ registers have been pushed to stack. void fiberManagerYield(MemAddr* sp) { using namespace FiberManager; if (_fibers.empty()) \/\/ No fibers in the list? { \/\/ No fibers to switch to, just return back to yield(). return; } \/\/ Does the current fiber own the stack pointed by sp? if ((*_itFiber)-&gt;isOwnerOfStack(sp)) { \/\/ Save current stack pointer to the fiber descriptor (*_itFiber)-&gt;saveStackPointer(sp); if (_fibers.size() &gt; 1) { \/\/ Select the next fiber. if (++_itFiber == _fibers.end()) \/\/ Is the last fiber? { \/\/ Go to first. _itFiber = _fibers.begin(); } } } else { \/\/ Execution goes here ONCE, when yield() is first called from the \/\/ MAIN stack context. We have only one such place in the start() function. assert(_mainSp == nullptr); \/\/ Save MAIN stack pointer to use it in the final completion. _mainSp = sp; } \/\/ Switch to the selected fiber using its own stack. lowLevelResume((*_itFiber)-&gt;getStackPointer()); assert(false); \/\/ The execution must never go here! }<\/code><\/pre>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e <code>fiberManagerYield<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u043f\u0443\u0441\u0442. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/p>\n<pre><code class=\"cpp\">if ((*_itFiber)-&gt;isOwnerOfStack(sp)) ...<\/code><\/pre>\n<p>\u043d\u0443\u0436\u043d\u0430 \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0431\u044b\u043b\u0430 \u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 <code>fiberManagerYield<\/code> \u0438, \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e, <code>yield()<\/code>, \u0438\u0437 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 (\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 true) \u0438\u043b\u0438 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 false). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434<\/p>\n<pre><code class=\"cpp\">bool FiberDescriptor::isOwnerOfStack(const MemAddr* sp)<\/code><\/pre>\n<p>\u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0435\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c <code>FiberDescriptor::_stack<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0435\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f) \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u043e. \u0415\u0441\u043b\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439, \u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e <code>yield()<\/code> \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0445\u043e\u0434\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 Fiber manager. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e, \u0441\u0442\u0435\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>_mainSp<\/code> \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0432\u043e\u043b\u043e\u043a\u043e\u043d. \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 <code>yield()<\/code>.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 &#8212; \u0432\u044b\u0437\u043e\u0432 <code>lowLevelResume<\/code><\/p>\n<pre><code class=\"cpp\">lowLevelResume((*_itFiber)-&gt;getStackPointer());<\/code><\/pre>\n<p>\u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>lowLevelResume<\/code>:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Get a new stack pointer from passed argument and switch the stack ; to return into a different fiber ; extern \"C\" void lowLevelResume(MemAddr*); lowLevelResume PROC     ; pSP:PTR     ; update esp with a new address taken from pSP parameter passed via stack     mov     esp, [esp + 4] ; pSP     ; extract previously saved non-volatile registers using the passed stack pointer     popall     ret lowLevelResume ENDP<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0431\u0435\u0437 \u0438\u0437\u044b\u0441\u043a\u043e\u0432: \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 <code>esp<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0442\u0435\u043a \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>lowLevelResume<\/code>. \u0410 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u0434\u0430\u043b\u0435\u0435 <code>ret<\/code> \u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430 \u0436\u0435 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430. \u0418 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f (\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c &#171;\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f&#187;, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>ret<\/code>) \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u0442\u0435\u043a\u0443.<\/p>\n<p>\u0412\u044b \u0435\u0449\u0451 \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0442\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435<\/p>\n<pre><code class=\"assembly\">push   0 push   0 push   0 push   0<\/code><\/pre>\n<p>\u0432 <code>lowLevelEnqueueFiber<\/code>? \u0422\u0430\u043a \u0432\u043e\u0442, \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0432\u044b\u0437\u043e\u0432\u043e\u0432<br \/><code>yield() --&gt; fiberManagerYield() --&gt; lowLevelResume()<\/code>,<br \/>\u0432 \u0435\u0433\u043e \u0441\u0442\u0435\u043a\u0435 \u0447\u0442\u043e-\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c, \u0447\u0442\u043e <code>popall<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435 <code>lowLevelResume<\/code> \u0432\u044b\u0442\u043e\u043b\u043a\u043d\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 <code>ebp<\/code>, <code>edi<\/code>, <code>esi<\/code>, <code>ebx<\/code>, \u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>ret<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u0442\u0435\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u044d\u0442\u0438 \u043d\u0443\u043b\u0438 \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0430\u043c\u043e\u0439 \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0422\u0430\u0439\u043d\u0430 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0430!<\/p>\n<p>-\u0410\u0432\u0442\u043e\u0440, \u043f\u043e\u0441\u0442\u043e\u0439! &#8212; \u0441\u043a\u0430\u0436\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, -\u0422\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043d\u0443\u043b\u044f\u0445 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u043f\u043b\u044e\u0441 \u0435\u0449\u0451 \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043d\u043e&#8230; \u0442\u0432\u043e\u0439 \u043a\u043e\u0434 \u0437\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432 \u0441\u0442\u0435\u043a \u0446\u0435\u043b\u044b\u0445 <strong>\u0448\u0435\u0441\u0442\u044c<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439!<\/p>\n<h3>\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0440\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f<\/h3>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u044b \u0430\u0432\u0442\u043e\u0440 \u0431\u044b\u043b \u0440\u0430\u0437\u043e\u0431\u043b\u0430\u0447\u0451\u043d \u0434\u043e\u0442\u043e\u0448\u043d\u044b\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>lowLevelEnqueueFiber<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430:<\/p>\n<pre><code class=\"assembly\">. . . . .     push    onFiberFinished  ; the handler which is called at the fiber completion stage     push    [ebp + 08h]      ; pFunc = pointer to a fiber function     ; allocate stack space to popping edi, esi, ebx, ebp in lowLevelResume()     push    0     push    0     push    0     push    0 . . . . .<\/code><\/pre>\n<p>\u0414\u0430, \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0442\u044b \u043f\u0440\u0430\u0432. \u041f\u0440\u0430\u0432 \u0432\u043e \u0432\u0441\u0451\u043c. \u041f\u043e\u0440\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0436\u0435 \u0431\u0443\u0434\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0440\u0435\u0448\u0438\u0442 \u0442\u0438\u0445\u043e-\u043c\u0438\u0440\u043d\u043e, \u043f\u043e-\u0441\u0438\u0448\u043d\u043e\u043c\u0443, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 <code>return<\/code>, \u0430 \u0442\u043e \u0438 \u0432\u043e\u0432\u0441\u0435 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u0432\u0435\u0434\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c void-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 C\/C++ \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0443\u0447\u0448\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>RET<\/code>. \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0430\u0448 \u043a\u043e\u0434 \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 &#8212; \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>onFiberFinished<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0423\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8230;\u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 C\/C++ \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0432 \u0435\u0451 \u0430\u0434\u0440\u0435\u0441. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0438\u043b\u0438 \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u042d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0434\u043b\u044f assembler.<\/p>\n<\/div>\n<\/details>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>onFiberFinished()<\/code> \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0434\u0440\u0435\u0441 <code>onFiberFinished<\/code> \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0434 \u0433\u043e\u0440\u044f\u0447\u0443\u044e \u0440\u0443\u043a\u0443 \u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>RET<\/code>.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u0442\u043e \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 \u0441\u0443\u043c\u0435\u0440\u0435\u0447\u043d\u043e\u0433\u043e \u0433\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u043b\u0438\u0436\u0435:<\/p>\n<pre><code class=\"cpp\">\/\/ This function is called from ASM code as a fiber completion. \/\/ It should ALWAYS call lowLevelResume() void onFiberFinished() { using namespace FiberManager; \/\/ Currently, completing fiber is ALWAYS the owner of the current stack. But we mus assert((*_itFiber)-&gt;isOwnerOfStack(lowLevelGetCurrentStack())); \/\/ Avoid of auto-destruction the FiberDescriptor by saving it to \/\/ finishedTask shared pointer. We need this stack to be allocated \/\/ because it is current stack we are working with right now. _finishedFiber.reset(_itFiber-&gt;release()); \/\/ Remove completed fiber from the list. _itFiber = _fibers.erase(_itFiber);  MemAddr* sp; if (_fibers.empty()) { \/\/ Prepare the final completion, we will return the control \/\/ from yield() to start() function. See yield() call in start(). sp = _mainSp; } else { \/\/ Switch to the next fiber. if (_itFiber == _fibers.end()) { _itFiber = _fibers.begin(); } sp = (*_itFiber)-&gt;getStackPointer(); } lowLevelResume(sp); \/\/ it doesn't return control! assert(false); }<\/code><\/pre>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 onFiberFinished() \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">assert((*_itFiber)-&gt;isOwnerOfStack(lowLevelGetCurrentStack()));<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c Fiber manager&#8217;\u0430 \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u043d, \u0442\u043e \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0414\u0430\u043b\u0435\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 <code>_fibers<\/code> \u0438, \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0443\u0441\u0442\u0435\u043b,  \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">sp = _mainSp;<\/code><\/pre>\n<p>\u0412 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0435\u043a \u0432\u043e\u043b\u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">sp = (*_itFiber)-&gt;getStackPointer();<\/code><\/pre>\n<p>\u0418 \u043e\u0442\u0434\u0430\u0451\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u0434 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435:<\/p>\n<pre><code class=\"cpp\">lowLevelResume(sp); \/\/ it doesn't return control!<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043e\u043d.<\/p>\n<h3>\u0417\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u043c\u0438\u0440 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h3>\n<p>C\/C++ \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u043e\u0431\u0449\u0438\u0439, \u0430 \u0441\u0430\u043c\u0430\u044f \u0432\u043a\u0443\u0441\u043d\u044f\u0448\u043a\u0430 &#8212; \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 &#8212; \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u0421\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435. \u0413\u0443\u0440\u043c\u0430\u043d\u044b \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0432\u0438\u043b\u043a\u0438, \u043d\u0430\u0442\u043e\u0447\u0438\u043b\u0438 \u043d\u043e\u0436\u0438, \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u043b\u0438 \u043f\u043e\u0431\u043b\u0438\u0436\u0435 \u043c\u0435\u0442\u0430\u0442\u0435\u043b\u0438 \u043b\u0430\u0439\u043a\u043e\u0432 \u0438 \u043d\u0430\u0432\u0435\u043b\u0438 \u0438\u0445 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u0430\u0432\u0442\u043e\u0440\u0430.<\/p>\n<p>64 \u0431\u0438\u0442\u0430 &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e 2 \u043f\u043e 32. \u042d\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e <s>\u0445\u0443\u0436\u0435<\/s>\u043b\u0443\u0447\u0448\u0435. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 64-\u0431\u0438\u0442\u043d\u044b\u043c\u0438, \u0438, \u043a \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u043d\u0430\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c 8 \u043d\u043e\u0432\u044b\u0445 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 <strong>R8<\/strong>&#8212;<strong>R15<\/strong> , <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u044f \u043a\u0430\u0441\u0430\u044e\u0442\u0441\u044f \u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0439 \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (<a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/x64-software-conventions?view=msvc-170\" rel=\"noopener noreferrer nofollow\">ABI<\/a>). \u0412\u0441\u0435 \u044d\u0442\u0438 cdecl \u0438 stdcall \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 fastcall:<\/p>\n<blockquote>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 4 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438\u043b\u0438 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b <code>RCX<\/code>, <code>RDX<\/code>, <code>R8<\/code>, \u0438 <code>R9<\/code>, \u0430 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b  <code>XMM0L<\/code>, <code>XMM1L<\/code>, <code>XMM2L<\/code>, \u0438 <code>XMM3L<\/code>. <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/x64-calling-convention?view=msvc-170#parameter-passing\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<\/blockquote>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (non-volatile registers):<\/p>\n<blockquote>\n<p> <code>RBX<\/code>, <code>RBP<\/code>, <code>RDI<\/code>, <code>RSI<\/code>, <code>RSP<\/code>, <code>R12<\/code>, <code>R13<\/code>, <code>R14<\/code>, <code>R15<\/code>, \u0438 <code>XMM6<\/code>&#8212;<code>XMM15<\/code> <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/x64-calling-convention?view=msvc-170#callercallee-saved-registers\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<\/blockquote>\n<details class=\"spoiler\">\n<summary>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u043a\u043e\u0434  \u043c\u0430\u043a\u0440\u043e\u043a\u043e\u043c\u0430\u043d\u0434 pushall\/popall \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>64-\u0431\u0438\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>rbp<\/code>, \u043c\u044b \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- pushmmx macro mmxreg     sub     rsp, 16     movdqu  [rsp], mmxreg     endm ;---------------------------------------------------------------------------- popmmx macro mmxreg     movdqu  mmxreg, [rsp]     add     rsp, 16     endm ;---------------------------------------------------------------------------- ; See https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/x64-calling-convention?view=msvc-170#callercallee-saved-registers pushall macro     push    rbx     push    rsi     push    rdi     push    r12     push    r13     push    r14     push    r15     pushmmx xmm6     pushmmx xmm7     pushmmx xmm8     pushmmx xmm9     pushmmx xmm10     pushmmx xmm11     pushmmx xmm12     pushmmx xmm13     pushmmx xmm14     pushmmx xmm15     endm ;---------------------------------------------------------------------------- ; See https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/x64-calling-convention?view=msvc-170#callercallee-saved-registers popall  macro     popmmx  xmm15     popmmx  xmm14     popmmx  xmm13     popmmx  xmm12     popmmx  xmm11     popmmx  xmm10     popmmx  xmm9     popmmx  xmm8     popmmx  xmm7     popmmx  xmm6     pop     r15     pop     r14     pop     r13     pop     r12     pop     rdi     pop     rsi     pop     rbx     endm ;----------------------------------------------------------------------------<\/code><\/pre>\n<\/div>\n<\/details>\n<blockquote>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0442\u0435\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u0430\u0432\u043d\u0435\u043d \u043d\u0430 \u0430\u0434\u0440\u0435\u0441, \u043a\u0440\u0430\u0442\u043d\u044b\u0439 16 \u0431\u0430\u0439\u0442.<\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043c\u0430\u043a\u0440\u043e\u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>alignstack<\/code>:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Align stack at 16 (see https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/stack-usage?view=msvc-160 )  alignstack macro     and     spl, 0f0h     endm ;----------------------------------------------------------------------------<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0435\u0449\u0451 \u0437\u0430 SPL \u0438 \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e\u0442 \u043e\u0433\u0440\u044b\u0437\u043e\u043a \u043d\u0443\u0436\u0435\u043d?<\/summary>\n<div class=\"spoiler__content\">\n<p><code>spl<\/code> &#8212; \u044d\u0442\u043e \u043c\u043b\u0430\u0434\u0448\u0430\u044f 8-\u0431\u0438\u0442\u043d\u0430\u044f (1 \u0431\u0430\u0439\u0442) \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430 <code>rsp<\/code>. \u0414\u043e\u0442\u043e\u0448\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043f\u0440\u043e\u0441\u0438\u0442: \u043e\u0442 \u0447\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440 \u043d\u0435 \u0436\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>rsp<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0435\u0433\u043e \u043e\u0433\u0440\u044b\u0437\u043a\u0430 <code>spl<\/code>? \u041d\u0435\u043b\u044c\u0437\u044f <code>rsp<\/code>, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"assembly\">and     rsp, 0fffffffffffffff0h<\/code><\/pre>\n<p>ml64.exe (\u044d\u0442\u043e macro assembler MASM) \u043f\u0440\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u043d\u0430\u043c:<\/p>\n<p><code>LowLevel_x86-64.asm(124) : error A2084:constant value too large<\/code><\/p>\n<p>\u042d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u043e \u0444\u0430\u043a\u0442: \u041d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/www.felixcloutier.com\/x86\/and\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 AND<\/a> \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b. \u0418 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e AND \u044d\u0442\u0438\u043c \u0433\u0440\u0435\u0448\u0438\u0442. \u0415\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b* \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e 64 \u0431\u0438\u0442 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 64-\u0431\u0438\u0442\u043d\u044b\u0439:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd8\/635\/cb4\/cd8635cb4c54af3f33cd7eb9a0597f98.png\" alt=\"\u0420\u0438\u0441. 6. \u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c x86-64 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439\" title=\"\u0420\u0438\u0441. 6. \u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c x86-64 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439\" width=\"1104\" height=\"79\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cd8\/635\/cb4\/cd8635cb4c54af3f33cd7eb9a0597f98.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd8\/635\/cb4\/cd8635cb4c54af3f33cd7eb9a0597f98.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 6. \u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c x86-64 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p>*) \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043d\u0430 \u0441\u0445\u0435\u043c\u0430\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u0446\u0438\u0439 CPU \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439 <code>imm<\/code> \u043e\u0442 \u0441\u043b\u043e\u0432\u0430 <em>immediate<\/em> &#8212; <a href=\"https:\/\/translate.google.com\/?sl=en&amp;tl=ru&amp;text=immediate&amp;op=translate\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043f\u0440\u044f\u043c\u043e\u0439<\/a>.<\/p>\n<\/div>\n<\/details>\n<blockquote>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c &#8212; \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u0442\u044c \u0432 \u0441\u0442\u0435\u043a\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c 32 \u0431\u0430\u0439\u0442\u0430 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e <strong>Shadow space<\/strong>. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043f\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/stack-usage?view=msvc-160#stack-allocation\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<\/blockquote>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0441\u0442\u0435\u043a\u0435, \u0447\u0438\u0441\u043b\u043e 32, \u0432 \u043a\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 <code>SHADOWSIZE<\/code>:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Shadow Space (see https:\/\/docs.microsoft.com\/en-us\/cpp\/build\/stack-usage?view=msvc-160 )  SHADOWSIZE equ 32 ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>Microsoft \u0432\u0435\u043b\u0438\u043a\u043e\u0434\u0443\u0448\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0430 \u0441\u0442\u0435\u043a \u0432 \u043d\u043e\u0432\u043e\u043c \u0434\u0438\u0432\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0434\u043b\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f A \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e B:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7cc\/d0c\/91d\/7ccd0c91d468884cf4f7090321c6a307.png\" alt=\"\u0420\u0438\u0441. 7. \u0424\u0443\u043d\u043a\u0446\u0438\u044f A \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e B.\" title=\"\u0420\u0438\u0441. 7. \u0424\u0443\u043d\u043a\u0446\u0438\u044f A \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e B.\" width=\"929\" height=\"878\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7cc\/d0c\/91d\/7ccd0c91d468884cf4f7090321c6a307.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7cc\/d0c\/91d\/7ccd0c91d468884cf4f7090321c6a307.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441. 7. \u0424\u0443\u043d\u043a\u0446\u0438\u044f A \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e B.<\/figcaption><\/div>\n<\/figure>\n<h4>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u043e\u0442\u043b\u0438\u0447\u0438\u0439 32- \u0438 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h4>\n<p>64-\u0431\u0438\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f <code>lowLevelEnqueueFiber<\/code>:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Should be used from MAIN context to add a new fiber to fiber dispatcher ; rcx - pointer to a fiber function ; rdx - void* data ; r8  - pointer to a function stack ; returns  rax - address of a new host's stack pointer ; extern \"C\" MemAddr* lowLevelEnqueueFiber(void(__stdcall*)(void*), void*, MemAddr*); lowLevelEnqueueFiber PROC     push    rbp     mov     rbp, rsp      mov     rsp, r8         ; prepare the top of stack for a new fiber     sub     rsp, SHADOWSIZE ; THIS SPACE IN TASK STACK IS REQUIRED BY ABI!     alignstack     ; onFiberFinished is handler which is called at the fiber completion stage.     mov     r8, onFiberFinished     push    r8     push    rdx     push    rcx     ; prepare fiber entry proxy function     mov     r8, fiberEntry     push    r8     pushall                 ; allocate stack space to popping non-volatile registers in lowLevelResume()      push    0               ; 0 is a value for RBP when it will be popped in lowLevelResume().     mov     rax, rsp      mov     rsp, rbp     pop     rbp     ret lowLevelEnqueueFiber ENDP ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043a\u043e\u0434\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430 \u0442\u0430\u043a\u043e\u0432\u043e\u043c\u0443 \u0432 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u043e \u0435\u0441\u0442\u044c \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0412 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434 Shadow space.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e\u0442 \u0441\u0442\u0435\u043a \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 16 \u0431\u0430\u0439\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e <code>push onFiberFinished<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"assembly\">    ; onFiberFinished is handler which is called at the fiber completion stage.     mov     r8, onFiberFinished     push    r8 <\/code><\/pre>\n<p>-\u041a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0436\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442&#8230; &#8212; \u0441\u043a\u0430\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. -\u041f\u043e\u043d\u044f\u0442\u043d\u043e \u0436\u0435, \u0447\u0442\u043e <code>onFiberFinished<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e!<\/p>\n<details class=\"spoiler\">\n<summary>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, push \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 64 \u0431\u0438\u0442&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8230;\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 32 \u0431\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0434\u043e 64 \u0431\u0438\u0442 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0442\u0435\u043a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>push<\/code> \u0441 32-\u0431\u0438\u0442\u043d\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u043c <code>80000000<sub>hex<\/sub><\/code><\/p>\n<pre><code class=\"assembly\">push   80000000h<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0442\u0435\u043a\u0430 \u0431\u0430\u0439\u0442\u044b (\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443):<\/p>\n<p><code>00 00 00 80 ff ff ff ff<\/code><\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0432 32-\u0431\u0438\u0442\u043d\u043e\u043c <code>80000000<sub>hex<\/sub><\/code> \u0440\u0430\u0432\u0435\u043d 1, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e &#8212; \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435, \u0438 \u0440\u0430\u0432\u043d\u043e <code>-2 147 483 648<sub>dec<\/sub><\/code>. \u0412\u043e\u0442 \u043e\u043d\u043e \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u0441\u044e \u043c\u043e\u0449\u044c 64-\u0445 \u0431\u0438\u0442!<\/p>\n<p>\u0416\u0438\u0432\u0438\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c <a href=\"https:\/\/www.felixcloutier.com\/x86\/push\" rel=\"noopener noreferrer nofollow\">\u0441 \u044d\u0442\u0438\u043c<\/a> \ud83d\ude00<\/p>\n<\/div>\n<\/details>\n<ul>\n<li>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 <code>lowLevelEnqueueFiber<\/code>  \u0447\u0435\u0440\u0435\u0437 <code>rcx<\/code>, \u0432 \u0441\u0442\u0435\u043a \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fiberEntry<\/code>. \u0410 \u043f\u0435\u0440\u0435\u0434 \u043d\u0435\u0439 \u0432\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b <code>rdx<\/code> \u0438 <code>rcx<\/code>. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u044d\u0442\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0430 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0432 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u044b \u043a\u043b\u0430\u043b\u0438 \u0432 \u0441\u0442\u0435\u043a \u0447\u0435\u0442\u044b\u0440\u0435 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u043d\u0443\u043b\u044f \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0451\u0445 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430? \u0412\u0441\u0435\u0433\u043e \u043e\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u0442\u0430\u043c 16 \u0431\u0430\u0439\u0442. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u043d\u0435 \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>pushall<\/code>. \u0414\u0430, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0443\u043b\u0435\u0439 \u0432 \u0441\u0442\u0435\u043a \u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u0447\u0442\u043e-\u0442\u043e \u043e\u043a\u043e\u043b\u043e 216 \u0431\u0430\u0439\u0442 \u043c\u0443\u0441\u043e\u0440\u0430 \u0438\u0437 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u043d\u043e \u043e\u043d \u043d\u0430\u043c \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>push 0<\/code> \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f <code>rbp<\/code>. \u042d\u0442\u043e\u0442 non-volatile \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 <code>pushall<\/code>\/<code>popall<\/code> \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0435\u043d\u043e. \u041c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043d\u0438\u043c \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f.<\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fiberEntry<\/code>:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Fiber entry code is used to prepare an input parameter in RCX fiberEntry PROC     pop     rdx             ; Target fiber function address     pop     rcx             ; Fiber argument pointer     enter   SHADOWSIZE, 0   ; it pushes RBP to current stack and sets RBP=RSP and then RSP -= SHADOWSIZE     alignstack              call    rdx             ; call fiber entry point      leave                   ; Restore stack (rsp) &amp; frame pointer (rbp)     ret fiberEntry ENDP ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>\u0421 \u0443\u0447\u0451\u0442\u043e\u043c \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u0439, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u0438\u0441\u0442\u0438\u043a\u0438 \u0442\u0430\u043c \u043d\u0435\u0442. <code>fiberEntry<\/code> \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a, \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e ABI \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u043e.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>yield()<\/code> \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0442\u0430\u043a\u043e\u0432\u0443\u044e \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430, \u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044e \u0441\u0442\u0435\u043a\u0430:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; void yield() is used to switch fiber. Should be called from running fiber. ; It is also used to run the initial fiber from main context yield PROC     pushall     enter   0, 0            ; it pushes RBP to current stack and sets RBP=RSP     mov     rcx, rsp        ; rcx is passed as parameter to fiberManagerYield     sub     rsp, SHADOWSIZE     alignstack     ; fiberManagerYield(sp) switches the execution to another fiber     call    fiberManagerYield      leave                   ; Restore stack (rsp) &amp; frame pointer (rbp)     popall     ret yield ENDP ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>\u0412 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u0441\u0451 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>enter<\/code>\/<code>leave <\/code>\u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f. \u0420\u0430\u043d\u0435\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<p>\u0421\u043e\u0432\u0441\u0435\u043c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 <code>lowLevelResume<\/code>, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>rcx<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0435\u043a\u0430:<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Get a new stack pointer from passed argument (rcx) and switch the stack ; to return into a different fiber ; rcx - target stack pointer ; extern \"C\" void lowLevelResume(MemAddr*); lowLevelResume PROC     mov     rsp, rcx     ; extract previously saved non-volatile registers     pop     rbp     popall     ret lowLevelResume ENDP ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>\u0427\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b! \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b. \u041e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432 C-\u043a\u043e\u0434\u0435:<\/p>\n<p>64-\u0431\u0438\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Get current stack pointer to provide it to C++ code ; extern \"C\" MemAddr* lowLevelGetCurrentStack(); lowLevelGetCurrentStack PROC     mov     rax, rsp     ret lowLevelGetCurrentStack ENDP ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>\u0418 \u0442\u0430\u043a\u0430\u044f \u0436\u0435 32-\u0431\u0438\u0442\u043d\u0430\u044f<\/p>\n<pre><code class=\"assembly\">;---------------------------------------------------------------------------- ; Get current stack pointer to provide it in C++ code ; extern \"C\" MemAddr* lowLevelGetCurrentStack(); lowLevelGetCurrentStack PROC     mov     eax, esp     ret lowLevelGetCurrentStack ENDP ;----------------------------------------------------------------------------<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043e\u043d\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 C-\u043a\u043e\u0434\u0435, \u0430, \u0441\u0442\u0430\u043b\u043e \u0431\u044b\u0442\u044c, \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439. \u041d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u043e\u0434\u0430 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0441\u043e\u0432 \u0438 \u043c\u044b\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439. \u0410\u0432\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u0437\u0430 \u043e\u0442\u0437\u044b\u0432\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043b\u0430\u0439\u043a\u0438 \u0438 \u043f\u043b\u044e\u0441\u0438\u043a\u0438 \u0432 \u043a\u0430\u0440\u043c\u0443.<\/p>\n<p><a href=\"https:\/\/github.com\/galilov\/CoopMultitasking\" rel=\"noopener noreferrer nofollow\"><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0430 GitHub<\/strong><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/908406\/\"> https:\/\/habr.com\/ru\/articles\/908406\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0430\u0440\u0430 \u043c\u043e\u0438\u0445 \u0445\u0430\u0431\u0440\u043e\u0432\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 [<a href=\"https:\/\/habr.com\/ru\/articles\/902412\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d<\/a>, <a href=\"https:\/\/habr.com\/ru\/articles\/907312\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0432\u0430<\/a>] \u043f\u043e \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0434\u043b\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Intel_8086\" rel=\"noopener noreferrer nofollow\">8086<\/a> \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0430\u0436\u0438\u043e\u0442\u0430\u0436\u0430, \u043d\u043e \u043e\u043f\u0440\u043e\u0441 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e 5% <s>\u043f\u043e\u0442\u0435\u0440\u043f\u0435\u0432\u0448\u0438\u0445<\/s> \u043f\u043e\u0447\u0438\u0442\u0430\u0432\u0448\u0438\u0445 \u0436\u0435\u043b\u0430\u044e\u0442 \u043e\u0442\u0432\u0430\u0434\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430 \u043e\u0442 \u0448\u0435\u0432\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043b\u044c\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435.<\/p>\n<p>\u0418\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u043e \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0441\u044f 95% \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0430\u0432\u0442\u043e\u0440 \u0440\u0435\u0448\u0438\u043b\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e, \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e <strong>\u0432 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445<\/strong> &#171;\u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e&#187; \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0441 \u0436\u0434\u0451\u0442 \u043c\u043e\u0437\u0433\u043e\u0432\u044b\u043d\u043e\u0441\u044f\u0449\u0430\u044f \u0441\u043c\u0435\u0441\u044c 64\/32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e x86-\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e-\u0434\u043e\u0431\u0440\u043e\u0433\u043e C++.<\/p>\n<h2>\u0411\u0435\u0437\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0412\u0441\u0451 \u043d\u0438\u0436\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 &#8212; \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0432\u0442\u043e\u0440\u0430 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442. \u041f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u0441\u0432\u043e\u0451 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u043d\u0430 \u0441\u0435\u0431\u044f \u0440\u0438\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439. \u0426\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u0440\u0430 &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <a href=\"https:\/\/github.com\/galilov\/CoopMultitasking\" rel=\"noopener noreferrer nofollow\"><strong>\u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/strong><\/a>, \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443, \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0437\u0451\u0442, \u0441\u0443\u043c\u0435\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0443\u0442\u044c \u044f\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0443, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c &#171;\u043d\u0438\u0442\u044c&#187; (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">thread<\/a>) \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. \u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u043d\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0442\u044c \u0412\u0438\u043a\u0438, &#8212; \u044d\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u044f\u0434\u0440\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c, \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u043d\u0438\u0442\u0435\u0439 \u0437\u0430\u0432\u0435\u0434\u0443\u0435\u0442 \u044f\u0434\u0440\u043e \u041e\u0421. \u0410 \u043c\u044b, \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043a\u043e\u043c\u0430\u043d\u0434\u0443\u0435\u043c \u044f\u0434\u0440\u0443, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0438\u0442\u044c\u044e. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u041e\u0421 \u0432\u043e\u043e\u0431\u0449\u0435 \u0443\u043c\u0435\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0432\u043e\u043b\u043e\u043a\u043d\u043e (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Fiber_(computer_science)\" rel=\"noopener noreferrer nofollow\">fiber<\/a>) &#8212; \u044d\u0442\u043e \u0435\u0449\u0451 \u043c\u0435\u043d\u044c\u0448\u0430\u044f, \u0447\u0435\u043c \u043d\u0438\u0442\u044c, \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f\u0434\u0440\u043e \u041e\u0421 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442. \u041d\u0438\u043a\u0430\u043a. \u0412\u043e\u043b\u043e\u043a\u043d\u0430 &#8212; \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u043a\u0430\u043a \u043d\u0438\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u043c, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 API. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043d\u0438\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u043b\u043e\u043a\u043e\u043d. \u041d\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u043b\u0436\u043d\u043e\u043c \u0443\u043c\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043b\u043b\u044e\u0437\u0438\u044e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0438\u0442\u0435\u0439 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044f\u0434\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c C++ \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/piter\/articles\/491996\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b<\/a>. \u0418\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0412\u043e\u043b\u043e\u043a\u043d\u0430 \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0442\u0430\u043a\u043e\u0432\u043e\u0439.<\/p>\n<p>Win32 API <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/procthread\/fibers\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u043c\u0438, <a href=\"https:\/\/www.boost.org\/doc\/libs\/1_88_0\/libs\/fiber\/doc\/html\/fiber\/overview.html\" rel=\"noopener noreferrer nofollow\">Boost::Fiber<\/a> &#8212; \u0442\u043e\u0436\u0435. \u041d\u043e, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u043c\u044b \u0438\u0434\u0451\u043c \u0441\u0432\u043e\u0438\u043c \u043f\u0443\u0442\u0451\u043c, \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0441\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043d\u044f\u0442\u044c \u0441\u0430\u043c\u0438\u043c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043c &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c&#187;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0438 <s>\u043f\u043e\u043b\u044e\u0431\u0438\u0442\u044c<\/s> \u043f\u043e\u043b\u0430\u0434\u0438\u0442\u044c \u0441 \u043d\u0438\u043c<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u044b\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c: \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0442\u0430\u043c <code>prologue<\/code>, <code>epilogue<\/code>, <code>invoke<\/code>, <code>stackframe<\/code>. \u0422\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0440, \u0442\u043e\u043b\u044c\u043a\u043e <code>mov rbp, rps<\/code> \u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a\u0430\u043a \u044f \u0441\u0430\u043c, <code>call<\/code> &#8212; \u0432\u0441\u0451 \u043a\u0430\u043a \u043c\u044b \u043b\u044e\u0431\u0438\u043c.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 <a href=\"https:\/\/visualstudio.microsoft.com\/ru\/downloads\/?cid=learn-onpage-download-install-visual-studio-page-cta\" rel=\"noopener noreferrer nofollow\"><strong>Microsoft Visual Studio 2022 Community<\/strong><\/a>, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0438 \u043d\u0430 <strong>2019<\/strong>. \u0421\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 <a href=\"https:\/\/github.com\/galilov\/CoopMultitasking\" rel=\"noopener noreferrer nofollow\"><strong>GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0430<\/strong><\/a>. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Visual Studio \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Assembler+C++ \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u0439 <a href=\"https:\/\/www.wikihow.com\/Use-MASM-in-Visual-Studio-2022\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/youtu.be\/zbOuzJkk4Fs\" rel=\"noopener noreferrer nofollow\">\u043a\u0438\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 <\/a>\u043e\u0442 <a href=\"https:\/\/www.youtube.com\/@dr.javaher\" rel=\"noopener noreferrer nofollow\">Dr. Nina Javaher<\/a>.<\/p>\n<h2>\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u043b\u043e\u043a\u043d\u0438\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 C\/C++<\/h2>\n<p><em>\u041f\u043e\u0447\u0442\u0438<\/em> \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<pre><code class=\"cpp\">void __stdcall fiber1(void* data) { for (auto i = 5; i &gt;= 0; --i) { std::cout &lt;&lt; \"+Fiber1:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; } }  void __stdcall fiber2(void* data) { for (auto i = 0; i &lt; 10; i++) { std::cout &lt;&lt; \"-Fiber2:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; } }  int main() { \/\/ register our fibers FiberManager::addFiber(fiber1, nullptr); FiberManager::addFiber(fiber2, nullptr); \/\/ run FiberManager::start(); \/\/ done std::cout &lt;&lt; \"***Exit***\" &lt;&lt; std::endl; return 0; }<\/code><\/pre>\n<p>\u0414\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0446\u0438\u043a\u043b\u044b \u0432 \u043d\u0438\u0445. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0442 5 \u0434\u043e 0 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0442 0 \u0434\u043e 9 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c&#8230;<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441. 1. \u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u0448\u0451\u043b \u0447\u0435\u043c \u0443\u0434\u0438\u0432\u0438\u0442\u044c! \u0410\u0432\u0442\u043e\u0440, \u0442\u044b \u0447\u0435\u043c \u0442\u0430\u043c \u043e\u0431\u044a\u0435\u043b\u0441\u044f?! \u0412\u0438\u0434\u043d\u043e \u0436\u0435, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <code>fiber1<\/code>, \u043f\u043e\u0442\u043e\u043c <code>fiber2<\/code>. \u0414\u0438\u0437\u043b\u0430\u0439\u043a \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u043a\u0430\u043a\u0430\u0448\u043a\u0430 \u0432 \u043a\u0430\u0440\u043c\u0443!<\/p>\n<p>\u0418\u0437\u0432\u0438\u043d\u0438, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u044f \u0437\u0430\u0431\u044b\u043b \u043a\u043e\u0435-\u0447\u0442\u043e, \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0448\u0430\u0433&#8230;<\/p>\n<pre><code class=\"cpp\">void __stdcall fiber1(void* data) { for (auto i = 5; i &gt;= 0; --i) { std::cout &lt;&lt; \"+Fiber1:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; yield(); \/\/ one small step for man... } }  void __stdcall fiber2(void* data) { for (auto i = 0; i &lt; 10; i++) { std::cout &lt;&lt; \"-Fiber2:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; yield(); \/\/ ...one giant leap for mankind } }  int main() { \/\/ register our fibers FiberManager::addFiber(fiber1, nullptr); FiberManager::addFiber(fiber2, nullptr); \/\/ run FiberManager::start(); \/\/ done std::cout &lt;&lt; \"***Exit***\" &lt;&lt; std::endl; return 0; }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>yield()<\/code>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441. 2. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f &#171;\u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438&#187; \u0432\u043e\u043b\u043e\u043a\u043e\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0438\u043c\u0441\u044f \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <strong>\u0447\u0435\u0440\u0435\u0434\u0443\u0435\u0442\u0441\u044f<\/strong>.<\/p>\n<p>-\u0422\u0430\u043a&#8230; \u044d\u0442\u043e \u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043d\u0438\u0442\u0438! \u0410\u0432\u0442\u043e\u0440, \u0432\u0441\u0451, \u043e\u0442\u043f\u0438\u0441\u043a\u0430!<br \/>-\u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435 \u043d\u0438\u0442\u0438. \u042f \u0436\u0435 \u043d\u0435 \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u043e \u0442\u0430\u043c \u0432\u044b\u0432\u043e\u0436\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Win32 API <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/processthreadsapi\/nf-processthreadsapi-getcurrentthreadid\" rel=\"noopener noreferrer nofollow\"><code>GetCurrentThreadId()<\/code><\/a>. \u041f\u043e Thread ID \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0438\u0442\u0438 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f&#8230;<\/p>\n<h2>\u041a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f fibers<\/h2>\n<p><strong>\u041a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u0445<\/strong> &#8212; \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430 (fiber) \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0438\u043b\u0438 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0430\u0448\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>yield()<\/code>. <strong>\u0412\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 user space<\/strong> \u0438, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043d\u0438\u0442\u0435\u0439, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432.<\/p>\n<p>\u041a <strong>\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c<\/strong> fibers \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 user space \u0438 kernel space, \u043d\u043e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 &#171;\u043e\u0442\u0434\u0430\u0447\u0438&#187; \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u044f\u0433\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u043e\u043d\u043a\u0438<\/a> (race condition). \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0433\u043e\u043d\u043a\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>yield()<\/code> \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u0412\u043d\u0443\u0442\u0440\u0438 <code>yield()<\/code> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043d\u0435\u0433\u043e \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 <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\" rel=\"noopener noreferrer nofollow\">\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438<\/a> \u0434\u043b\u044f \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430.<\/p>\n<p>\u041a <strong>\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c<\/strong> \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0439\u043d\u044e\u044e \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Win32 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/synchapi\/nf-synchapi-sleep\" rel=\"noopener noreferrer nofollow\"><code>Sleep(milliseconds)<\/code><\/a> &#171;\u043f\u043e\u0432\u0435\u0441\u0438\u0442&#187; \u0432\u0441\u044e \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>mySleep<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Win32 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/sysinfoapi\/nf-sysinfoapi-gettickcount64\" rel=\"noopener noreferrer nofollow\"><code>GetTickCount64()<\/code><\/a>:<\/p>\n<pre><code class=\"cpp\">void mySleep(uint32_t milliseconds) { \/\/ Retrieve the number of milliseconds that have elapsed since the system was started. \/\/ See https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/sysinfoapi\/nf-sysinfoapi-gettickcount64 ULONGLONG t = GetTickCount64(); while (GetTickCount64() &lt; t + milliseconds) { yield(); } }<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>mySleep(uint32_t milliseconds)<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0451 \u0432\u044b\u0437\u0432\u0430\u043b\u043e, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0442.\u043a. &#171;\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443&#187; \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield()<\/code>, \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u0432\u043e\u0438\u043c \u0441\u043e\u0441\u0435\u0434\u044f\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">void __stdcall fiber1(void* data) { for (auto i = 5; i &gt;= 0; --i) { std::cout &lt;&lt; \"+Fiber1:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; mySleep(300); } }  void __stdcall fiber2(void* data) { for (auto i = 0; i &lt; 10; i++) { std::cout &lt;&lt; \"-Fiber2:\" &lt;&lt; ::GetCurrentThreadId() &lt;&lt; \" \" &lt;&lt; i &lt;&lt; std::endl; mySleep(100); } }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>mySleep()<\/code> \u0443\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield()<\/code>, \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u044f\u0432\u043d\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043c\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u043e\u043b\u043e\u043a\u043d\u0443. \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<pre><code>+Fiber1:10140 5 -Fiber2:10140 0 -Fiber2:10140 1 -Fiber2:10140 2 +Fiber1:10140 4 -Fiber2:10140 3 -Fiber2:10140 4 -Fiber2:10140 5 +Fiber1:10140 3 -Fiber2:10140 6 +Fiber1:10140 2 -Fiber2:10140 7 -Fiber2:10140 8 -Fiber2:10140 9 +Fiber1:10140 1 +Fiber1:10140 0 ***Exit*** <\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u0430\u0445 \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">std::string myReadString() { std::string result; for (;;) { if (_kbhit()) { char c = static_cast&lt;char&gt;(_getch_nolock()); if (c == '\\r') { break; } _putch_nolock(c); result += c; } yield(); } return result; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/getch-nolock-getwch-nolock?view=msvc-170\" rel=\"noopener noreferrer nofollow\"><code>_getch_nolock()<\/code><\/a> \u0438 <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/getch-nolock-getwch-nolock?view=msvc-170\" rel=\"noopener noreferrer nofollow\"><code>_putch nolock()<\/code><\/a> &#8212; \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0432 <code>conio.h<\/code>.<\/p>\n<p>\u0421\u0430\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0433\u0434\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0430\u0447\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043d\u0438\u0442\u044f\u043c \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c. \u041d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u043c: \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e, \u0432\u044b\u0437\u043e\u0432 <code>yield()<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432 \u043e\u0431\u0435\u0440\u0442\u043a\u0430\u0445 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 <code>poll()<\/code>\/<code>select()<\/code> \u0438 \u0434\u0430\u043b\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0437 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0441 \u0441\u0435\u0442\u044c\u044e \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h2>\u0423 \u043c\u0435\u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0435&#8230; \u0433\u043c&#8230; \u043d\u0435\u043e\u043d\u043a\u0430<\/h2>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>&#8212; \u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0438\u0447\u0435\u0433\u043e  \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u0430\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442  \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0440\u043e\u0435&#8230;<\/p>\n<p>&#8212; \u0412\u043d\u0443\u0442\u0440\u0435! &#8212; \u043f\u0440\u043e\u0448\u0435\u043b\u0435\u0441\u0442\u0435\u043b  \u0441\u0442\u0430\u0440\u0438\u0447\u043e\u043a. &#8212; \u0412\u043d\u0443\u0442\u0440\u0435  \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0433\u0434\u0435 \u0443 \u043d\u0435\u0451 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u0434\u0443\u043c\u0430\u0442\u0435\u043b\u044c&#8230;<\/p>\n<p>&#8212; \u0410\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440&#8230; &#8212;  \u0441\u043a\u0430\u0437\u0430\u043b  \u044f. &#8212; \u041d\u0435\u0442  \u0437\u0434\u0435\u0441\u044c  \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430. \u0421\u0435\u0440\u0438\u0439\u043d\u044b\u0439 \u0432\u044b\u043f\u0440\u044f\u043c\u0438\u0442\u0435\u043b\u044c &#8212;  \u0435\u0441\u0442\u044c, \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u0440\u0438\u043d\u043d\u044b\u0439. \u041d\u0435\u043e\u043d\u043e\u0432\u0430\u044f  \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f. <strong>\u0422\u0443\u043c\u0431\u043b\u0435\u0440<\/strong>. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u0443\u043c\u0431\u043b\u0435\u0440, \u043d\u043e\u0432\u044b\u0439. \u0422\u0430-\u0430\u043a&#8230; \u0415\u0449\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0448\u043d\u0443\u0440. \u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0448\u043d\u0443\u0440, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u044b\u0439&#8230; \u0412\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0438 \u0432\u0441\u0451.<\/p>\n<p>&#8212; \u0410p\u043a\u0430\u0434\u0438\u0439 \u0421\u0442\u0440\u0443\u0433\u0430\u0446\u043a\u0438\u0439, \u0411\u043ep\u0438\u0441 \u0421\u0442\u0440\u0443\u0433\u0430\u0446\u043a\u0438\u0439.<br \/>&#171;\u0421\u043a\u0430\u0437\u043a\u0430 \u043e \u0422p\u043e\u0439\u043a\u0435&#187;<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u044b \u0441 \u0434\u0435\u0442\u0441\u0442\u0432\u0430 \u043b\u044e\u0431\u0438\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0412\u043e\u0442 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0420\u0438\u0441. 3):<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441. 3. \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u043b\u043e\u043a\u043e\u043d.<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c, \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 \u043c\u043e\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/907312\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439<\/a>, \u044d\u0442\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u043d\u0438\u0442\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u0417\u0434\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield()<\/code> \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0435.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 <code>yield()<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 Fiber manager, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u043b\u043e\u043a\u043e\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 <code>esp<\/code>\/<code>rsp<\/code>  \u043d\u0430 \u0441\u0442\u0435\u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u0430, \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>RET<\/code> \u0432 \u044d\u0442\u043e \u0432\u043e\u043b\u043e\u043a\u043d\u043e, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u043e\u043b\u043e\u043a\u043d\u0435 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043c <code>yield()<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u043e\u043b\u043e\u043a\u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 \u0441\u0432\u043e\u0451\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>yield()<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<blockquote>\n<p>\u041c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041e\u0441\u043e\u0431\u043d\u044f\u043a\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0432\u043e\u043b\u043e\u043a\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e Fiber Manager \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u043b\u043e\u043a\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u043c\u0443 \u0441\u0432\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043a, \u0432 \u0447\u0438\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0438\u0445 \u0432\u0435\u0449\u0435\u0439, <strong>\u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u043e\u043a\u043d\u0430<\/strong>  <code>onFiberFinished()<\/code> \u0438 <strong>\u0430\u0434\u0440\u0435\u0441 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043e\u043b\u043e\u043a\u043d\u0430<\/strong>. \u0421\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code><\/code><\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-460611","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/460611","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=460611"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/460611\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=460611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=460611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=460611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}