あめだまふぁくとりー

Boost.Graphとかできますん

Boost

Boost.Asio でのタイマのキャンセル処理の仕方

先日, マイナンバーのカード管理システムの障害の原因と対応についての発表がありました. 地方公共団体情報システム機構 カード管理システムの中継サーバに生じた障害原因の特定と対応について その原因 2 では, Windows のタイマをキャンセルしたのにタイム…

io_service の使い方

この記事は C++ Advent Calendar 2015 14 日目の記事です. 13 日目は okdshin さんの Boost.Computeでグラボを燃やす - クリアボックス でした. 本記事の内容 本記事では io_service をどう使うかについて書きます. 具体的には, io_service の使用モデルを整…

initiating function 内で yield_context を呼べるようになった

Boost 1.58.0 以降では, Asynchronous operation の initiating function (async_write_some など) 内で直接 yield_context の handler の呼び出しが可能になりました. 以前まではどうだったかというと, spawn 外へのコンテキストスイッチ (initiating funct…

Boost 1.59 を GitHub リポジトリのソースからビルド

いつもは zip か, Homebrew でインストールしていたのを使用していましたが, 今回は GitHub から持ってきたのでメモを残しておきます. # boost のトップリポジトリを取得 git clone https://github.com/boostorg/boost.git # 各ライブラリのリポジトリを取得…

Asio の coroutine で明示的に yield する

実行時間がかかる処理 A を coroutine の中で行うと, その coroutine と同じ strand 内の処理は処理 A が完了するまで待たされてしまいます. io_service::post または strand::post を使用することで, 処理 A の合間で明示的に coroutine を切り替えることが…

boost::asio::async_write / read の限界

asio::async_write と asio::async_read に難癖をつけてみます. stream のコンテキストとハンドラのコンテキストが分離されていない socket への書き込み (読み込み) 処理は sock_strand 内で実行し, その書き込み (読み込み) 完了のハンドラは handler_stra…

連続で async_write するまでの道のり (その 3)

単一の socket で連続して async_write するの 3 回目で, 最終回です. 前回の記事では strand を使用方法について見ました. 本記事では作成する queueing socket の wrapping callback に strand を適用する方法を見ていきます. wrapping callback の実装 qu…

boost::asio::asio_handler_is_continuation の効果

asio_handler_is_continuation の効果がいまいち良く分からなかったので調べてみました. ある handler について, asio_handler_is_continuation の結果が true の場合, 処理が以下の様に少し変わります. handler はスレッド固有の private queue に一度登録…

連続で async_write するまでの道のり (その 2)

単一の socket で連続して async_write するの 2 回目です. 前回の記事 では, 普通に socket に対して非同期送信関数を連続で呼び出す際の問題点について整理しました. 前回の内容を踏まえると, 以下のような動作をする async_write_some メソッドを持つ soc…

連続で async_write するまでの道のり (その 1)

単一の socket を使用して, 一つ目の送信処理の完了を待たずに二つ目の送信処理を実行したいといった場合は多々あります. レスポンスの順番がリクエストの順番とは異なる非同期プロトコルを使用または実装する場合には, そういったケースに特に遭遇します. B…

標準入出力を Boost.Asio で非同期に行う

標準入出力を Boost.Asio で非同期に行いたい場合は, posix::stream_descriptor を使用するといいみたいです. 使用例 #include <chrono> #include <iostream> #include <boost/asio/buffer.hpp> #include <boost/asio/io_service.hpp> #include <boost/asio/posix/stream_descriptor.hpp> #include <boost/asio/read_until.hpp> #include </boost/asio/read_until.hpp></boost/asio/posix/stream_descriptor.hpp></boost/asio/io_service.hpp></boost/asio/buffer.hpp></iostream></chrono>

Boost.Asio で read / async_read を使用する際の注意点

1. boost::asio::streambuf と組み合わせる場合 うっかり, boost::asio::async_read(socket, streambuf, handler); 見たいに書くと, 永遠に handler が起動されない可能性があるので注意しましょう. これは, async_read は指定されたサイズ分読みを行い, デ…

Boost.Test で Test Suite と Test Case の Fixture の併用

Boost.Test では,Test Case に対して Fixture を設定すると,Test Suite レベルの Fixture がその Test Case に対して使用されなくなります. よって,以下のようなコードはコンパイルエラーになってしまいます. #define BOOST_TEST_DYN_LINK #define BOOS…

Boost.Graph property to Boost.Fusion

Boost.Graph のグラフ構造体で使用される property を fusion::for_each で使用できるようにしてみました. ソースは こちら にあげています. property に bundle (ユーザが定義した構造体)が含まれる場合, bundle は fusion::for_each 上には現れないので注…

Boost.Program_optionsで名前を持たないオプションの扱い方

Boost.Program_optionsについて調べてみたので,備忘録として. 名前を持たないオプションの対応 以下が名前を持たないオプション値の例です.オプション値hogeはoptionという名前に関連づけされていますが,huga.txtには関連づけされた名前がありません. $…