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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- C++のBSDソケットAPI
- TCPエコーサーバーの構築
- epollとkqueueによる非同期I/O
- Boost Asioで現代的な非同期I/Oを使う