C++のboostで色々やってみる


目次(リンク貼ってないものは今後試してみたい項目)

  1. マルチスレッド・排他制御(boost::thread)
  2. コンフィグ解析
  3. コマンドライン引数のオプション解析
  4. jsonのパース
  5. タスクスケジューラ
  6. ログ出力
  7. テスト
  8. リングバッファ
  9. 時刻・日付
  10. グラフ作成
  11. マルチプロセス・排他制御
  12. メモリプール
  13. Python
  14. 正規表現
  15. タイマー時刻測定
  16. UUID


1.マルチスレッド・排他制御(boost::thread)

長くなったので別ページにしてます。
https://www.mathkuro.com/?p=805

内容は以下の感じでまとめています。

  1. 基本形
    1. サンプルコード
    2. コンパイル例
  2. 引数を渡す場合
  3. 返り値(戻り値)を受け取る場合
  4. クラスのメンバ関数でスレッドを立てる場合
  5. 排他制御(mutex)
    1. 基本形
    2. recursive-mutex
    3. read-lock/write-lock(shared-lock/upgrade-lock)
  6. 条件変数(condition variable)
  7. エラー等の対処・TIPS
    1. BOOST_THREAD_MOVABLE_ONLYでコンパイルエラー
    2. boost::condition_variableでアボート
    3. undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’でコンパイルに失敗


2.コンフィグ解析

pythonのconfigparser的なものが欲しかったんです。boostだと、boost::property_treeでできるみたいです。

※boostにはboost::configとかいう紛らわしい輩もいらっしゃいますが、これはboostをconfigurationするためのライブラリなのでconfigparser的なことはできません。

INI形式のコンフィグは割といい感じに読み込めそうです。自前で用意するより百億倍楽ですね。


3.コマンドライン引数のオプション解析

pythonのargparse的なものが欲しかったんです。もちろんgetoptという選択肢もありますが、新しいの試してみたかったので。

getoptに慣れている人間からすると少しクセがありますが、行数も減らせますし、見た目スッキリするので、今後コマンドライン引数を使う場合はこれに使用と思います。


4.jsonのパース

jsonのパースもboost::property_treeでできるみたいです。
ただ、jsonの入力形式がかなり厳格で、すぐに例外を吐きやがるので使いにくいかもしれません。
他のjsonライブラリを導入する実績・余裕があるならそちらの使用をお勧めします。


5.タスクスケジューラ

Boost ASIOを使ってタスクスケジューラを作ってみました。

cronみたいに毎日・毎時・毎分に実行できるようにしました。

グレゴリウス暦の方使いこなせたらweeklyもできそうかも。。。?

コンパイルがちょっと面倒です。
g++ -std=c++11 ./task_scheduler.cpp -o ./task_scheduler -L /usr/local/Cellar/boost/1.71.0/lib/ -lpthread -lboost_thread-mt -lboost_date_time


参考

https://www.boost.org/doc/libs/1_71_0/
https://www.boost.org/doc/libs/1_71_0/doc/html/program_options.html
https://boostjp.github.io/tips/program_options.html

https://boostjp.github.io/tips/json.html

Leave a Reply

Your email address will not be published. Required fields are marked *