0Pricing
C++ Academy · レッスン

Boost Asioで現代的な非同期I/Oを使う

移植性の高い現代的な非同期I/OにBoost.Asioを使います。

「Boost Asioで現代的な非同期I/Oを使う」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

Boost.Asio

Boost.Asioは、C++におけるデファクトスタンダードの非同期I/Oライブラリです。クロスプラットフォームで、ほぼヘッダーオンリーの構成になっており、数多くのサービスで本番利用されています。

io_context

Asioの中心となるのはboost::asio::io_contextです。これはイベントループであり、すべての非同期操作がその上で実行されます。

#include <boost/asio.hpp>
namespace asio = boost::asio;

asio::io_context io;
// register async operations...
io.run();

アクセプターとソケット

ip::tcp::acceptorは着信接続を待ち受け、ip::tcp::socketは個々の接続を処理します。

asio::ip::tcp::acceptor acceptor(io,
    {asio::ip::tcp::v4(), 8080});
asio::ip::tcp::socket socket(io);
acceptor.async_accept(socket, [&](auto err) {
    if (!err) handle(std::move(socket));
});

コールバック形式

非同期操作には完了ハンドラー(通常はラムダ)を渡します。操作が完了すると、ハンドラーはio_contextのスレッド上で実行されます。

asio::async_read(socket, asio::buffer(buf),
    [](auto err, size_t n) {
        if (!err) std::cout << "read " << n << " bytes";
    });

コルーチン形式(C++20)

最新のAsioはC++20コルーチンをサポートしています。同期コードのように記述しながら、非同期に実行できます。

asio::awaitable<void> handle(asio::ip::tcp::socket sock) {
    char buf[1024];
    auto n = co_await sock.async_read_some(asio::buffer(buf), asio::use_awaitable);
    co_await asio::async_write(sock, asio::buffer(buf, n), asio::use_awaitable);
}

スレッドセーフティのためのstrand

複数のio_contextスレッドを実行する場合でも、同じデータに触れるハンドラーを直列化するにはstrandを使用します。これにより、ロックなしで安全性を確保できます。

タイマー

Asioにはio_contextに組み込まれたタイマーがあります。遅延後に実行する処理をスケジュールできます。

asio::steady_timer timer(io, std::chrono::seconds(5));
timer.async_wait([](auto err) {
    std::cout << "5 seconds passed";
});

バッファー

asio::bufferはI/O用のメモリをラップします。ベクター、配列、文字列で使用できます。

std::vector<char> data(1024);
async_read(sock, asio::buffer(data), handler);

エラー処理

非同期ハンドラーはerror_codeを受け取ります。切断やタイムアウトなど、想定される失敗には例外ではなくこれを使用します。

Standalone Asio

AsioはBoostに依存しないStandaloneライブラリとしても利用できます。Boostを避けたいプロジェクトに便利です。

パフォーマンス

Asioは最速クラスのC++非同期ライブラリの1つです。1つのスレッドで多数の同時接続に対応でき、マルチスレッドのio_contextにも対応しています。

使用する場面

Asioは次の用途に使用します。

  • 高性能ネットワークサーバー
  • クロスプラットフォームの非同期I/O
  • コルーチンベースの非同期コード
  • 数万の接続が必要なシステム

確認問題

Boost.Asioでイベント処理を駆動する中心的なオブジェクトは何ですか。

まとめ

Boost.Asioはクロスプラットフォームの非同期I/Oを提供します。io_contextがイベントループを駆動します。従来の形式にはコールバックを、同期コードのように見える非同期コードにはコルーチンを使用します。Standalone AsioはBoostなしで動作します。

よくある質問

「Boost Asioで現代的な非同期I/Oを使う」レッスンは無料ですか?

はい。「Boost Asioで現代的な非同期I/Oを使う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「Boost Asioで現代的な非同期I/Oを使う」で何を学びますか?

移植性の高い現代的な非同期I/OにBoost.Asioを使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Boost Asioで現代的な非同期I/Oを使う」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. C++のBSDソケットAPI
  2. TCPエコーサーバーの構築
  3. epollとkqueueによる非同期I/O
  4. Boost Asioで現代的な非同期I/Oを使う
← C++ Academyに戻る