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

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

XX. 今後試したい内容

  • ログ出力
  • テスト
  • リングバッファ
  • 時刻・日付
  • グラフ作成
  • マルチプロセス・排他制御
  • メモリプール
  • Python
  • 正規表現
  • タイマー時刻測定
  • UUID

参考

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

コメント

タイトルとURLをコピーしました