yohhoyの日記

技術的メモをしていきたい日記

Boost

std::expected<T, E>

次期C++2b(C++23)標準ライブラリに追加されるstd::expected<T, E>クラステンプレートについてメモ。 従来C++例外機構(throw文+try/catch構文)に代わり、関数の演算結果(T型)またはエラー情報(E型)を “値” として返す(return)ための部品。 C++17 std::optional<T>型の</t></t,>…

std::clamp

C++1z(C++17)標準ライブラリでは、指定区間内に値を制限するstd::clamp関数テンプレートが追加される。*1 #include <algorithm> int b = std::clamp(3, 1, 6); // 3 int a = std::clamp(0, 1, 6); // 1(下限値) int c = std::clamp(8, 1, 6); // 6(上限値) 同様の関数テ</algorithm>…

空のweak_ptrと期限切れを判別

C++11標準ライブラリまたはBoost.Smart_Pointersライブラリが提供するスマートポインタweak_ptrにて、空(empty)状態と参照先の期限切れを区別する方法。本記事の内容はStack Overflowで見つけた質問と回答に基づく。 // C++11 #include <memory> using namespace std</memory>…

条件変数とデッドロック・パズル(解答編)

条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知notify_oneの使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事) 問題: 1生産者スレッド−1消費者スレッドのとき、mt_s…

条件変数とデッドロック・パズル(出題編)

条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知notify_oneの使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事)スレッド間の非同期データ送受信機構mt_slot<T>として*1、</t>…

条件変数 Step-by-Step入門

長いのでこちら→条件変数 Step-by-Step入門 - yohhoyの日記(別館) コード:https://gist.github.com/yohhoy/d305a6c5249c55ed89a3

論理/物理プロセッサコア数の取得

Boost.Thread 1.56.0では、従来からあるシステムの論理プロセッサコア数取得関数に加えて、物理プロセッサコア数取得関数が追加された。 #include <boost/thread.hpp> int vnum = boost::thread::hardware_concurrency(); // 論理コア数 int pnum = boost::thread::physical_co</boost/thread.hpp>…

boost::synchronized_valueクラス

Boost.Thread 1.54.0で実験的に追加された boost::synchronized_value<T> クラステンプレートについてメモ。要約: 型Tに対して、複数スレッド間での暗黙的な排他アクセス インタフェースを提供するラッパクラス。synchronized_value<T>クラスは、boost::mutex*1と</t></t>…

declvalの戻り値型とvoid

C++11標準ライブラリおよびBoost.Utilityライブラリで提供されるdeclval<T>ンプレートの戻り値型についてメモ。 template<class T> typename add_rvalue_reference<T>::type declval() noexcept; 戻り値型が単純なT&&となっていない理由は、テンプレートパラメータT=void型</t></class></t>…

Boost.Thread 1.52.0 condition_variableメモリ浪費問題

Boost.Threadライブラリ 1.52.0の条件変数boost::condition_variableバグ修正(#7461)でのリグレッションにより、condition_variableオブジェクトでの反復的な待機/通知処理を行うとメモリリークが発生する。WindowsシステムかつBoost 1.52.0のみ影響を受…

引数プレースホルダの衝突回避

C++11標準ライブラリとBoost.Bindライブラリが提供する、関数バインダ用の引数プレースホルダ(placeholders)に関するメモ。C++標準ライブラリとBoost.Bindライブラリを(暗黙的に*1)併用する場合、_1や_2などの引数プレースホルダ名が衝突するケースがある…

書籍"The Boost C++ Libraries"

書籍"The Boost C++ Libraries"の旧Edition全文がWeb公開されている。同内容はBoostライブラリ 1.42.0に基づく。Creative Commons BY-NC-NDライセンス。2014-11-01追記:Boostライブラリ 1.56.0まで対応したアップデートが行われている。 The Boost C++ Libr…

Boost.Asioのstrand

Boost.Asioライブラリが定義・提供する strand についてメモ。Boost.Asioライブラリが定義する概念上の「ストランド(strand)*1」と、直列化プリミティブとしての「io_service::strandクラス」の混同に注意。 ストランド(strand) 逐次実行されるイベントハン…

shared_ptr相互乗り入れ

C++11標準ライブラリとBoost.Smart_Pointersライブラリでそれぞれ提供される共有ポインタshared_ptrクラステンプレートの相互運用に関するメモ。本記事の内容はStack Overflowで見つけた質問と回答内容に基づく。注意:あくまで “技術的に相互運用が可能であ…

lock非メンバ関数の使いどころ

C++11標準ライブラリやBoost.Threadライブラリで提供される、複数ロック操作lock非メンバ関数の適用先についてメモ。lock非メンバ関数の仕様上、ロック競合しうる複数ミューテックスを指定してもデッドロック(deadlock)しない。この関数の内部実装には try-a…

Boost.Thread 1.50.0 condition_variableタイムアウト付き待機処理の問題

Boost.Threadライブラリ 1.50.0の条件変数boost::condition_variableでは誤った対処(#6130)が行われており、condition_variableオブジェクトのタイムアウト付き待機関数において常に余計なタイムアウト時間が長くとられる。Linux/Mac OS XシステムかつBoo…

condition_variable_any+recursive_mutexの注意点

C++11標準ライブラリやBoost.Threadライブラリで提供されるcondition_variable_anyとrecursive_mutexの組み合わせについてメモ。まとめ:condition_variable_anyとrecursive_mutexの組み合わせ利用は避けること。*1 *2条件変数condition_variable_anyのwait…

shared_ptrとスレッド安全性

C++11標準ライブラリのスマートポインタstd::shared_ptrでは、C++標準ライブラリの既定レベルのスレッド安全性(→id:yohhoy:20120513)を提供する。 同一オブジェクトを指していたとしても、異なる2つのshared_ptrオブジェクトは異なるスレッドからそれぞれ…

C++11とBoost.ThreadのMutex/Lock比較表

C++11標準ライブラリで新たに追加された排他制御ライブラリ/標準ヘッダ<mutex>と、Boost.Threadライブラリ 1.49.0の比較一覧表。C++11とBoost.Threadライブラリでは、いくつかのLockable要件(requirements)*1を定義し、各種Mutex型およびLockオブジェクトを提供す</mutex>…

C++スレッド遅延開始の実装5パターン

本文こちら→C++スレッド遅延開始の実装5パターン - yohhoyの日記(別館)コード:https://gist.github.com/yohhoy/2421197

Boost.Contextでファイバーライブラリを実装してみた

長いのでこちら→Boost.Contextでファイバーライブラリを実装してみた - yohhoyの日記(別館) ライブラリコード:https://gist.github.com/yohhoy/2318086 サンプルコード:https://gist.github.com/yohhoy/2342248

to_string関数

C++11標準ライブラリに新しく追加されたstd::to_string関数についてメモ*1。組み込み数値型(intやdouble)から文字列クラスstd::stringに変換する。変換処理はsprintf相当で行われる(書式指定文字列については後述)。 #include <string> auto s1 = std::to_string</string>…

(翻訳)Boost.Threadライブラリが"イベント変数"を提供しない理由

元文書:Boost.Thread 1.34.1 Rationale for not providing Event Variables, Beman Dawes氏訳出メモ: 元文書はBoost 1.35.0以降で削除されてしまったが*1、基本的なAPI設計は変わっておらずBoost 1.49.0現在でも通用する内容となっている。 訳文中では "Ev…

条件変数とspurious wakeup

条件変数(condition variable)同期プリミティブにまつわる "spurious wakeup" についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spurious は “偽の; 疑似; 似非” といった意味の単語であり*2、wakeup は “条件変数…

enable_shared_from_thisクラステンプレート

C++11標準ライブラリで追加されたenable_shared_from_thisクラステンプレートについてメモ。Boost.Smart Pointersライブラリでも同機能を提供している。N3337 20.7.2.4/p1より引用。 A class T can inherit from enable_shared_from_this<T> to inherit the sha</t>…

range-based forで逆順走査

C++11で追加されたrange-based for構文とBoost.Rangeアダプタを組み合わせて逆順走査。 #include <boost/range/adaptors.hpp> int main() { int a[] = {1, 1, 2, 3, 5, 8, 13, 21}; for (auto x : boost::adaptors::reverse(a)) { //... } } 関連URL c++ - C++11 reverse range-based f</boost/range/adaptors.hpp>…

function/bindとクラスデータメンバ

C++11標準ライブラリのstd::functionやstd::bindでは、クラスのデータメンバ(メンバ変数)を格納できる。 #include <functional> struct A { int md; void mf(int v) { md = v * 2; } } a; // メンバ関数 A::mf (比較用) std::function<void (A&, int)> f1 = &A::mf; f1(a, 3); // a.m</void></functional>…

Boost.Asioでお手軽並列ライブラリを実装

Boost.Asioを使って、スレッドプールを利用した簡単な並列アルゴリズムを実装してみた。名前は適当にTiny Parallel Library(むしろ"Toy"の方が似合う気がする)。 概要 実装した並列アルゴリズムは下記3つのみで、インタフェースはIntel TBBおよびMicrosoft…

threadの利用と例外安全(その3)

C++11標準ライブラリとBoost.Threadライブラリ(Boost 1.48.0)に含まれる、threadオブジェクトのデストラクタの振る舞いと例外安全に関するメモ。その1, その2 の続き。2020-12-02追記:C++2a(C++20)標準ライブラリでは、デストラクタで自動的にjoinを呼び…

threadの利用と例外安全(その2)

C++11標準ライブラリとBoost.Threadライブラリ(Boost 1.48.0)に含まれる、threadオブジェクトのデストラクタの振る舞いと例外安全に関するメモ。その1 の続き。2020-12-02追記:C++2a(C++20)標準ライブラリでは、デストラクタで自動的にjoinを呼び出すstd:…