コンピュータ技術の継続的な発展に伴い、プログラミング方法も絶えず革新され、改善されています。その中でもコルーチンプログラミングは比較的新しいプログラミング手法とされています。コルーチン プログラミングは、1958 年にメルビン コンウェイによって論文で初めて提案されました。しかし、コルーチン プログラミングを真に推進し、適用するのは C 言語です。そこで、この記事ではC言語の観点からコルーチンプログラミングを詳しく分析して解説していきます。
コルーチンとは何ですか?
コルーチン プログラミングを説明する前に、まずコルーチンとは何かを理解する必要があります。コルーチンは、実行が特定のポイントに達したときに一時停止し、実行を続行する前に再起動を待つことができる特別なサブ関数として単純に理解できます。従来の関数呼び出しと比較して、コルーチンの実行方法はより柔軟です。
コルーチンの一時停止とウェイクアップは、呼び出し元ではなく、コルーチン自体で制御できます。この利点は、コルーチンが長期にわたる操作を実行するときに、CPU リソースを放棄して他のタスクを実行できるため、コンピューター リソースをより有効に活用できることです。
C では、キーワード co_await を使用してコルーチンを実装できます。これにより、コルーチンは特定のポイントまで実行するときに一時停止し、事前に設定された条件に達した後に再起動できます。
コルーチンの使い方
C でコルーチンを使用するには、コルーチン ライブラリの助けが必要です。現在、最も一般的に使用されているコルーチン ライブラリは、Boost.Coroutine と C 20 に付属のコルーチン ライブラリです。 C 20 のコルーチンを例にして、コルーチンの使用方法を説明します。
C 20 では、co_await キーワードと co_yield キーワードを使用してコルーチン関数を定義できます。 co_await は現在のコルーチンを一時停止し、起動されるのを待つことを意味します。一方、co_yield は、現在のコルーチンを一時停止し、コルーチン関数が特定の点に達したときにいくつかの値またはステータスを返すことを意味します。以下は、コルーチン関数の簡単な例です。
#include <iostream> #include <coroutine> using namespace std; struct HelloWorld { struct promise_type { HelloWorld get_return_object() { return {}; } std::suspend_never initial_suspend() { return {}; } std::suspend_never final_suspend() noexcept { return {}; } void unhandled_exception() {} }; HelloWorld() {}; void print() { cout << "Hello, world!" << endl; } void operator()() {} }; int main() { HelloWorld hello_world; hello_world(); hello_world.print(); return 0; }
上の例では、コルーチン関数である HelloWorld という名前の構造体を定義します。この構造では、コルーチン関数の動作を制御する、promise_type と呼ばれるネストされた構造を実装します。また、「Hello, world!」という文字列を出力する print というメンバー関数も定義します。
C 20 では、coroutine_handle クラスを使用してコルーチンの実行ステータスを制御できます。コルーチン関数を呼び出す前に、coroutine_handle オブジェクトを取得する必要があります。コルーチン関数が実行された後、オブジェクトを手動で解放する必要があります。例は次のとおりです。
int main() { HelloWorld hello_world; auto handle = hello_world(); handle.resume(); hello_world.print(); handle.destroy(); return 0; }
上の例では、最初に coroutine_handle オブジェクトを取得し、次にそのresume() 関数を呼び出します。これにより、co_await または co_yield キーが設定されるまでコルーチン関数内のコードが実行されます。単語が見つかった場合、現在のコルーチンは一時停止されます。最後に、手動で destroy() 関数を呼び出してコルーチンを解放します。
コルーチン関数では、キーワード co_await および co_yield を使用してコルーチンを一時停止できます。以下は例です:
#include <iostream> #include <coroutine> using namespace std; struct Generator { struct promise_type { int current_value; std::suspend_always yield_value(int value) { current_value = value; return {}; } std::suspend_never initial_suspend() { return {}; } std::suspend_never final_suspend() noexcept { return {}; } Generator get_return_object() { return Generator(coroutine_handle<promise_type>::from_promise(*this)); } void unhandled_exception() {} }; Generator(coroutine_handle<promise_type> h) : coro(h) {} coroutine_handle<promise_type> coro; bool next() { coro.resume(); return not coro.done(); } int value() { return coro.promise().current_value; } ~Generator() { coro.destroy(); } }; Generator fibonacci(int to) { int a = 0, b = 1; while (a <= to) { co_yield a; auto tmp = a + b; a = b; b = tmp; } } int main() { Generator gen = fibonacci(10); while (gen.next()) { cout << gen.value() << " "; } return 0; }
上の例では、Generator という名前の構造体を定義します。これはコルーチン関数でもあります。コルーチン関数内に while ループを定義し、co_yield キーワードが実行されるたびに、現在の a の値が呼び出し元に返され、a と b の値が更新されます。 main 関数では、Generator 関数を呼び出して Generator オブジェクトを取得し、その next() 関数を継続的に呼び出して、コルーチン関数によって返された結果を取得します。
概要
上記の例を通して、コルーチン プログラミングによりプログラムをより効率的かつ柔軟にできることがわかります。実際には、コルーチン プログラミングは、ネットワーク プログラミング、マルチスレッド プログラミングなど、さまざまな同時プログラミング シナリオで広く使用されています。
C では、コルーチン ライブラリを利用して、より簡単かつ効率的にコルーチン プログラミングを実装できます。将来的には、コンピュータ技術の発展と C 標準の継続的な改善により、コルーチン プログラミングはより多くの場面で適用され、促進されるでしょう。
以上がC++でのコルーチンプログラミングの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。