|
68 | 68 |
|
69 | 69 | </head> |
70 | 70 | <body> |
71 | | -<header data-kunai-mdinfo="{"meta": {"header": ["execution"], "id-type": ["class"], "namespace": ["std::execution"], "cpp": ["cpp26"]}, "sources": [{"id": "a68826a1a36f74f60c0d1c09d3b7e1f93a31d85e", "source": "#include <execution>\n#include <print>\nnamespace ex = std::execution;\n\nint main()\n{\n ex::scheduler auto sch = ex::inline_scheduler{};\n\n std::this_thread::sync_wait(\n ex::schedule(sch)\n | ex::then([]{ std::println(\"task\"); })\n );\n}\n"}], "page_id": ["reference", "execution", "execution", "inline_scheduler"]}"> |
| 71 | +<header data-kunai-mdinfo="{"meta": {"header": ["execution"], "id-type": ["class"], "namespace": ["std::execution"], "cpp": ["cpp26"]}, "sources": [{"id": "410e349738c667b6d8517603e319589bf3a26ebb", "source": "#include <execution>\n#include <thread>\n#include <print>\nnamespace ex = std::execution;\n\n// ex::task\u7528\u306e\u30ab\u30b9\u30bf\u30e0\u74b0\u5883\nstruct TaskEnv {\n using start_scheduler_type = ex::inline_scheduler;\n};\n\nex::task<void> f(ex::scheduler auto sch)\n{\n std::println(\"step1 main#{}\", std::this_thread::get_id());\n\n // \u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u3092\u5909\u66f4\u3057\u3066\u30b5\u30d6\u30bf\u30b9\u30af\u3092\u5b9f\u884c\n co_await (ex::schedule(sch) | ex::then([]{\n std::println(\"step2 worker#{}\", std::this_thread::get_id());\n }));\n\n // \u30c7\u30d5\u30a9\u30eb\u30c8(task_scheduler)\u30bf\u30b9\u30af\u30b3\u30eb\u30fc\u30c1\u30f3\u306eco_await\u5f0f\u3067\u306f\u3001\n // Scheduler Affinity\u52d5\u4f5c\u306b\u3088\u308a\u5143\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u4e0a\u3067\u51e6\u7406\u304c\u7d99\u7d9a\u3059\u308b\u3002\n std::println(\"step3 main#{}\", std::this_thread::get_id());\n}\n\nex::task<void, TaskEnv> g(ex::scheduler auto sch)\n{\n std::println(\"step1 main#{}\", std::this_thread::get_id());\n\n // \u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u3092\u5909\u66f4\u3057\u3066\u30b5\u30d6\u30bf\u30b9\u30af\u3092\u5b9f\u884c\n co_await (ex::schedule(sch) | ex::then([]{\n std::println(\"step2 worker#{}\", std::this_thread::get_id());\n }));\n\n // inline_scheduler\u3092\u6301\u3064\u30bf\u30b9\u30af\u30b3\u30eb\u30fc\u30c1\u30f3\u306eco_await\u5f0f\u3067\u306f\u3001\n // \u30b3\u30eb\u30fc\u30c1\u30f3\u306e\u518d\u958b(resume)\u6642\u306b\u518d\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u304c\u884c\u308f\u308c\u306a\u3044\u3002\n // \u3053\u306e\u305f\u3081co_await\u5f0f\u5185\u3067\u5909\u66f4\u3057\u305f\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u304c\u5f15\u304d\u7d99\u304c\u308c\u308b\u3002\n std::println(\"step3 worker#{}\", std::this_thread::get_id());\n}\n\nint main()\n{\n // \u30ef\u30fc\u30ab\u30fc\u30b9\u30ec\u30c3\u30c9\u3092\u958b\u59cb\n ex::run_loop loop;\n std::jthread worker{[&]{\n loop.run();\n }};\n auto sch = loop.get_scheduler();\n\n std::println(\"task_scheduler(default)\");\n std::this_thread::sync_wait( f(sch) );\n\n std::println(\"inline_scheduler\");\n std::this_thread::sync_wait( g(sch) );\n\n loop.finish();\n}\n"}], "page_id": ["reference", "execution", "execution", "inline_scheduler"]}"> |
72 | 72 | <nav class="navbar navbar-default" role="navigation"> |
73 | 73 | <div class="container-fluid"> |
74 | 74 | <div class="navbar-header"> |
|
200 | 200 |
|
201 | 201 | <p class="text-right"><small> |
202 | 202 | 最終更新日時(UTC): |
203 | | - <span itemprop="datePublished" content="2026-06-09T07:03:31"> |
204 | | - 2026年06月09日 07時03分31秒 |
| 203 | + <span itemprop="datePublished" content="2026-06-09T10:26:15"> |
| 204 | + 2026年06月09日 10時26分15秒 |
205 | 205 | </span> |
206 | 206 | <br/> |
207 | 207 | <span itemprop="author" itemscope itemtype="http://schema.org/Person"> |
@@ -307,23 +307,73 @@ <h2>メンバ型</h2> |
307 | 307 | </tbody> |
308 | 308 | </table> |
309 | 309 | <h2>例</h2> |
310 | | -<p><div class="yata" id="a68826a1a36f74f60c0d1c09d3b7e1f93a31d85e"><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../../execution.html"><execution></a></span> |
| 310 | +<p><div class="yata" id="410e349738c667b6d8517603e319589bf3a26ebb"><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../../execution.html"><execution></a></span> |
| 311 | +<span class="cp">#include <a href="../../thread.html"><thread></a></span> |
311 | 312 | <span class="cp">#include <a href="../../print.html"><print></a></span> |
312 | 313 | <span class="k">namespace</span><span class="w"> </span><span class="nn">ex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nn">std</span><span class="o">::</span><span class="nn">execution</span><span class="p">;</span> |
313 | 314 |
|
314 | | -<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> |
| 315 | +<span class="c1">// <a href="task.html">ex::task</a>用のカスタム環境</span> |
| 316 | +<span class="k">struct</span><span class="w"> </span><span class="nc">TaskEnv</span><span class="w"> </span><span class="p">{</span> |
| 317 | +<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">start_scheduler_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n"><span style="color:#ff0000">ex::inline_scheduler</span></span><span class="p">;</span> |
| 318 | +<span class="p">};</span> |
| 319 | + |
| 320 | +<span class="n"><a href="task.html">ex::task</a></span><span class="o"><</span><span class="kt">void</span><span class="o">></span><span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="n"><a href="scheduler.html">ex::scheduler</a></span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">sch</span><span class="p">)</span> |
| 321 | +<span class="p">{</span> |
| 322 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"step1 main#{}"</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">get_id</span><span class="p">());</span> |
| 323 | + |
| 324 | +<span class="w"> </span><span class="c1">// スケジューラを変更してサブタスクを実行</span> |
| 325 | +<span class="w"> </span><span class="k">co_await</span><span class="w"> </span><span class="p">(</span><span class="n"><a href="schedule.html">ex::schedule</a></span><span class="p">(</span><span class="n">sch</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n"><a href="then.html">ex::then</a></span><span class="p">([]{</span> |
| 326 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"step2 worker#{}"</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">get_id</span><span class="p">());</span> |
| 327 | +<span class="w"> </span><span class="p">}));</span> |
| 328 | + |
| 329 | +<span class="w"> </span><span class="c1">// デフォルト(task_scheduler)タスクコルーチンのco_await式では、</span> |
| 330 | +<span class="w"> </span><span class="c1">// Scheduler Affinity動作により元のスケジューラ上で処理が継続する。</span> |
| 331 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"step3 main#{}"</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">get_id</span><span class="p">());</span> |
| 332 | +<span class="p">}</span> |
| 333 | + |
| 334 | +<span class="n"><a href="task.html">ex::task</a></span><span class="o"><</span><span class="kt">void</span><span class="p">,</span><span class="w"> </span><span class="n">TaskEnv</span><span class="o">></span><span class="w"> </span><span class="n">g</span><span class="p">(</span><span class="n"><a href="scheduler.html">ex::scheduler</a></span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">sch</span><span class="p">)</span> |
315 | 335 | <span class="p">{</span> |
316 | | -<span class="w"> </span><span class="n"><a href="scheduler.html">ex::scheduler</a></span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">sch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n"><span style="color:#ff0000">ex::inline_scheduler</span></span><span class="p">{};</span> |
| 336 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"step1 main#{}"</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">get_id</span><span class="p">());</span> |
| 337 | + |
| 338 | +<span class="w"> </span><span class="c1">// スケジューラを変更してサブタスクを実行</span> |
| 339 | +<span class="w"> </span><span class="k">co_await</span><span class="w"> </span><span class="p">(</span><span class="n"><a href="schedule.html">ex::schedule</a></span><span class="p">(</span><span class="n">sch</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n"><a href="then.html">ex::then</a></span><span class="p">([]{</span> |
| 340 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"step2 worker#{}"</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">get_id</span><span class="p">());</span> |
| 341 | +<span class="w"> </span><span class="p">}));</span> |
| 342 | + |
| 343 | +<span class="w"> </span><span class="c1">// inline_schedulerを持つタスクコルーチンのco_await式では、</span> |
| 344 | +<span class="w"> </span><span class="c1">// コルーチンの再開(resume)時に再スケジューリングが行われない。</span> |
| 345 | +<span class="w"> </span><span class="c1">// このためco_await式内で変更したスケジューラが引き継がれる。</span> |
| 346 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"step3 worker#{}"</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">get_id</span><span class="p">());</span> |
| 347 | +<span class="p">}</span> |
| 348 | + |
| 349 | +<span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">()</span> |
| 350 | +<span class="p">{</span> |
| 351 | +<span class="w"> </span><span class="c1">// ワーカースレッドを開始</span> |
| 352 | +<span class="w"> </span><span class="n"><a href="run_loop.html">ex::run_loop</a></span><span class="w"> </span><span class="n">loop</span><span class="p">;</span> |
| 353 | +<span class="w"> </span><span class="n"><a href="../../thread/jthread.html">std::jthread</a></span><span class="w"> </span><span class="n">worker</span><span class="p">{[</span><span class="o">&</span><span class="p">]{</span> |
| 354 | +<span class="w"> </span><span class="n">loop</span><span class="p">.</span><span class="n"><a href="run_loop/run.html">run()</a></span><span class="p">;</span> |
| 355 | +<span class="w"> </span><span class="p">}};</span> |
| 356 | +<span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">sch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">loop</span><span class="p">.</span><span class="n"><a href="run_loop/get_scheduler.html">get_scheduler()</a></span><span class="p">;</span> |
| 357 | + |
| 358 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"task_scheduler(default)"</span><span class="p">);</span> |
| 359 | +<span class="w"> </span><span class="n"><a href="../this_thread/sync_wait.html">std::this_thread::sync_wait</a></span><span class="p">(</span><span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="n">sch</span><span class="p">)</span><span class="w"> </span><span class="p">);</span> |
| 360 | + |
| 361 | +<span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"inline_scheduler"</span><span class="p">);</span> |
| 362 | +<span class="w"> </span><span class="n"><a href="../this_thread/sync_wait.html">std::this_thread::sync_wait</a></span><span class="p">(</span><span class="w"> </span><span class="n">g</span><span class="p">(</span><span class="n">sch</span><span class="p">)</span><span class="w"> </span><span class="p">);</span> |
317 | 363 |
|
318 | | -<span class="w"> </span><span class="n"><a href="../this_thread/sync_wait.html">std::this_thread::sync_wait</a></span><span class="p">(</span> |
319 | | -<span class="w"> </span><span class="n"><a href="schedule.html">ex::schedule</a></span><span class="p">(</span><span class="n">sch</span><span class="p">)</span> |
320 | | -<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n"><a href="then.html">ex::then</a></span><span class="p">([]{</span><span class="w"> </span><span class="n"><a href="../../print/println.html">std::println</a></span><span class="p">(</span><span class="s">"task"</span><span class="p">);</span><span class="w"> </span><span class="p">})</span> |
321 | | -<span class="w"> </span><span class="p">);</span> |
| 364 | +<span class="w"> </span><span class="n">loop</span><span class="p">.</span><span class="n"><a href="run_loop/finish.html">finish()</a></span><span class="p">;</span> |
322 | 365 | <span class="p">}</span> |
323 | 366 | </code></pre></div> |
324 | 367 | </div></p> |
325 | | -<h3>出力</h3> |
326 | | -<p><pre><code>task |
| 368 | +<h3>出力例</h3> |
| 369 | +<p><pre><code>task_scheduler(default) |
| 370 | +step1 main#124468393588544 |
| 371 | +step2 worker#124468391311040 |
| 372 | +step3 main#124468393588544 |
| 373 | +inline_scheduler |
| 374 | +step1 main#124468393588544 |
| 375 | +step2 worker#124468391311040 |
| 376 | +step3 worker#124468391311040 |
327 | 377 | </code></pre></p> |
328 | 378 | <h2>バージョン</h2> |
329 | 379 | <h3>言語</h3> |
|
0 commit comments