yohhoyの日記

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

2012-01-01から1年間の記事一覧

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…

C++ Transactional Memory言語拡張の紹介

本文こちら→Boost.勉強会 #10 に参加しました - yohhoyの日記(別館)スライド資料:http://www.slideshare.net/yohhoy/boostjp10-tm-20120728

atomic compare_exchange_weak/strong関数

C++

C++11標準ライブラリのatomic操作関数compare_exchange_weakとcompare_exchange_strongについてメモ。両関数ともに変数のatomicなCAS(compare-and-swap)操作を提供する。weak版とstrong版との動作仕様は、weak版では “交換可能な場合でもCAS操作失敗する可能…

vector/arrayとUniform initialization+Initializer list

C++

C++11標準ライブラリstd::vector, std::arrayにおいて Uniform initialization と Initializer list を組み合わせた場合に、N3337現在ではそれぞれ異なる表記が必要となる。2012年7月現在、CWG defect #1270に挙げられている*1。2013-11-16追記:CWG#1270が…

一回だけ呼び出し可能な関数オブジェクト

C++

std::async+std::launch::deferredで一回だけ呼び出し可能な関数オブジェクト(のようなモノ)。 #include <future> #include <functional> // bad_function_call #include <utility> template <class R> class once_function { std::future<R> ftr_; public: template <class F, class... Args> explicit once_function(F&& f</class></r></class></utility></functional></future>…

__bool_true_false_are_defined

C

C99以降のC標準ライブラリヘッダstdbool.hでは、マクロbool, true, falseが定義済みであることを表すマクロ__bool_true_false_are_definedを定義する。どうでもいいメモ:C99までで一番長い識別子名?N1256 7.16/p1-3より引用。 1 The header <stdbool.h> defines four </stdbool.h>…

atomic変数のstore/load操作と代入/型変換

C++

C++11標準ライブラリのatomic変数std::atomic<T>について、型Tからatomic<T>への代入はstore操作に等しく、atomic<T>から型Tへの暗黙型変換はload操作に等しい*1。 #include <atomic> std::atomic<int> a; int x; a = 5; // a.store(5, std::memory_order_seq_cst); x = a; // x = </int></atomic></t></t></t>…

タイムアウト関数とsteady clock

C++

C++11標準ライブラリの絶対時刻によるタイムアウト付き待機処理(xxx_until系関数)を常に意図通り動作させるには、クロックとしてstd::chrono::system_clockではなくstd::chrono::steady_clockを利用する*1。下記コードにおいてsystem_clock::is_steady == …

標準入出力とbasic_ios::tie

C++

標準入力ストリームcinと標準エラーストリームcerrは、それぞれ標準出力ストリームcoutに結び付け(tie)られている。N3337 27.4.2/p2, p5, 27.5.5.3/p1より該当箇所を引用。*1 istream cin; 2 After the object cin is initialized, cin.tie() returns &cout.…

標準入出力のリダイレクション

C++

標準入出力ストリーム(cin, cout等)の入出力先を一時的に変更するヘルパクラス。 std::ifstream("input.txt"); ioredirector rd0(std::cin, ifs); std::string s; while (std::getline(std::cin, s)) /* input.txtから1行読込 */; // coutへ出力... 標準出力…

tee ostream

C++

UNIX tee(2)コマンド っぽく動作するostream。ストリーム出力すると予めバインドした2個の出力ストリームに同データを転送する。 std::ofstream ofs("log.txt"); tee_ostream tee(std::cout, ofs); // teeストリーム作成 tee << "tee emulation" << std::end…

和積演算(FMA)

C C++

C99標準ライブラリではデジタル信号処理の定番、和積演算(FMA; fused multiply-add)fma関数が追加されている。同関数はC++11標準ライブラリ<cmath>ヘッダでも提供される。fma関数では和積演算を単一の演算子として浮動小数点数の丸めを行う。すなわち通常の 乗算→丸</cmath>…

lock-freeとaddress-free

C++

C++11標準ライブラリにおけるatomic変数のロックフリー(lock-free)に関連して、規格中で言及されている "address-free" についてメモ。N3337 29.4/p3より引用。 [Note: Operations that are lock-free should also be address-free. That is, atomic operati…

(無印)→Ex→ExEx

Windows APIでよく見る関数名XxxxExには、発展系XxxxExExまで到達した関数名が存在する。 EnumCalendarInfo function EnumCalendarInfoEx function EnumCalendarInfoExEx function 関連URL winapi - What does it mean when `Ex` is added to a function/met…

volatile版atomic操作関数が存在する理由

C++

C++11標準ライブラリのatomic変数において、操作関数にvolatile非修飾/修飾版の2種類が提供される理由。volatile変数とatomic変数は直交する概念であり、単に「volatileオブジェクトに対してもatomic操作を提供するため」に追加されている。*12021-04-21追…

なんちゃってScopeExit

C++

「nullptrを所有するshared_ptr」を使って何か面白いことが出来ないかと適当にひねり出した応用例。C++11標準ライブラリだけで Boost.ScopeExit(スコープガード)のお手軽実装。 #include <memory> #define MY_SCOPE_EXIT(name_, ...) \ std::shared_ptr<void> name_(null</void></memory>…

C++11 atomic_flagプリミティブ

C++

C++11標準ライブラリでは最もプリミティブなatomic変数としてstd::atomic_flagを提供する。これは “std::atomic<bool>から極限まで機能を削ったatomic変数” とも解釈できる。2021-03-09追記:C++20標準ライブラリでは利便性のためtest操作やwait/notify_*操作が追</bool>…

C11/C++11 TLS変数への間接アクセス

C C++

C11およびC++11の言語仕様に追加されたThread Local Storage(TLS)変数についてメモ。あるスレッドに属するTLS変数に対して他スレッドから間接的にアクセスした場合、その挙動はC11では処理系定義(implementation-defined)とされる。一方、C++11では同TLS変数…

nullptrを所有するshared_ptr

C++

C++11標準ライブラリのstd::shared_ptrでは、ヌルポインタを所有することが可能となっている。デフォルトコンストラクトされたshared_ptrオブジェクトは空(empty)となる。一方、明示的にnullptrを与えてコンストラクトしたshared_ptrオブジェクトは “ヌルポ…

mutexのconstexprコンストラクタ

C++11標準ライブラリのミューテックスクラス群においてstd::mutexのみがconstexprデフォルトコンストラクタをもつ。N3337 30.4.1.2.1, 30.4.1.2.2, 30.4.1.3.1, 30.4.1.3.2よりコンストラクタ宣言のみ引用。 30.4.1.2.1 Class mutex class mutex { constexpr…

C11/C++11/POSIXスレッドAPI比較

C11標準ライブラリ、C++11標準ライブラリ、POSIXスレッドのスレッドライブラリ(Pthreads) API比較。各スレッドライブラリAPIを、“スレッド”、“CallOnce”、“排他制御(mutex)”、“条件変数(condition variable)”、“TLS(Thread Local Storage)”、その他機能に分…

ムーブの跡

C++

C++11におけるムーブされた後のオブジェクト状態についてメモ。C++11標準規格ではムーブ後のオブジェクト状態について、下記2種類の型に対する要求を規定する。N3264のRationale参照*1。 [A] 標準ライブラリが提供するクラス [B] 標準ライブラリと組み合わせ…

POSIXメモリモデル?

POSIX規格(IEEE Std 1003.1-2001)では定式化されたメモリモデルを定義しない。 A.4.10 Memory Synchronization Formal definitions of the memory model were rejected as unreadable by the vast majority of programmers. In addition, most of the form…

2種類のstd::move関数

C++

C++11標準ライブラリのstd::move関数テンプレートには、標準ヘッダ<utility>と<algorithm>とで用途の異なる2種類が存在する。 ヘッダ<utility>のmove 変数(lvalue値)に対してムーブセマンティクスを適用するためのヘルパ関数。 ヘッダ<algorithm>のmove std::copyアルゴリズムのmove版。InputIterat</algorithm></utility></algorithm></utility>…

Joke in C/C++ Standard

C C++

プログラミング言語CおよびC++の標準規格(ドラフト)に存在していたジョーク文。atomic操作ライブラリ記述箇所に下記脚注あり。*1 Atomic objects are neither active nor radioactive. Among other implications, atomic variables shall not decay. 関連U…

The Spirit of C11

C

C11ではANSI C Rationale以来の “Cの精神(The Spirit of C)” に対して改訂が行われ、安全性・セキュリティに関する配慮が加えられた。JTC1/SC22/WG14 (PDF)N1250 C - The C1X Charter より引用(下線部は強調)。 6. Keep the spirit of C. The Committee ke…

パスワードとString型

Javaプログラム上で高機密性情報(パスワード文字列など)を扱う場合、セキュリティ的にはjava.lang.Stringクラスよりchar型の配列char[]の方が好ましい。Java言語の文字列Stringインスタンスは不変(Immutable)なオブジェクトであり、メモリ上からデータ破棄…

auto&&の落とし穴

C++

C++11で導入されたautoによる型推論とrvalue参照(T&&)に関するメモ。auto&&による型推論の結果が常にrvalue参照型となるとは限らない。 int x; auto t0 = x; // t0はint型 auto& t1 = x; // t1はint&型 auto&& t2 = x; // t2はint&型(int&&型ではない) au…

main関数returnと他スレッドの関係

C C++

プログラミング言語C/C++言語におけるmain関数returnと他スレッドの関係についてメモ。C11/C++11ともに “メインスレッドのmain関数からのreturn” は標準ライブラリexit関数呼び出しと等価であり、他に実行中スレッドが存在したとしても該当プロセスを終了す…

Relacy Race Detector

C++

C++11メモリモデルに基づく競合検出ツール。BSD-likeライセンス。 Relacy Race DetectorRelacy Race Detector is a tool for efficient execution of unit-tests for synchronization algorithms written in C++0x. Every user thread is represented as a f…