2012-03-01から1ヶ月間の記事一覧
Windows XP以前のWindows APIでは同期プリミティブとしての条件変数(condition variable)が提供されない。セマフォ(semaphore)やミューテックス(mutex)/クリティカルセクション*1を組み合わせて、条件変数プリミティブを実装するアルゴリズムおよびコード実…
元文書:Boost.Thread 1.34.1 Rationale for not providing Event Variables, Beman Dawes氏訳出メモ: 元文書はBoost 1.35.0以降で削除されてしまったが*1、基本的なAPI設計は変わっておらずBoost 1.49.0現在でも通用する内容となっている。 訳文中では "Ev…
Javaクラスファイル(拡張子class)のマジックナンバー 0xCAFEBABE の由来について。 This reply is the actual answer to the question, supplied by Patrick Naughton, one of the original members of the team that eventually produced Java. I quoted …
C++11標準ライブラリの条件変数std::condition_variableおよびstd::condition_variable_anyは仕様上 spurious wakeup を許容する(→id:yohhoy:20120326)。このため条件変数のタイムアウト付き待機関数wait_until, wait_forの動作において、「通知を受けてい…
条件変数(condition variable)同期プリミティブにまつわる "spurious wakeup" についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spurious は “偽の; 疑似; 似非” といった意味の単語であり*2、wakeup は “条件変数…
C++11標準ライブラリのstd::mutexオブジェクトでは、ロック取得/解放を同一スレッド*1から行わなければならない。(N3337 30.2.5.2/p3) m.unlock() Requires: The current execution agent shall hold a lock on m. この制約条件のため、下記コードのmutex…
IntelとMicrosoftから並列プログラミングのパターン集が公開されている。 (PDF) Intel® Threading Building Blocks Design Patterns Patterns and Practices for parallel programming in C++ (PDFダウンロードへのリンク) 2012-06-21追記:エクセルソフトよ…
id:ignisanさんのC++ Advent Calendar 2011 記事で知った gcc Parallel Mode 拡張についてメモ。http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html Runtime Library (libstdc++) An experimental parallel mode has been added. This is a…
Microsoft PPL/Agents/ConcRT*1を利用した並列プログラミングに関する電子書籍。HTML版がMSDNにて無償公開されている。 Parallel Programming with Microsoft® Visual C++® -- Design Patterns for Decomposition and Coordination on Multicore Architectur…
C++11標準ライブラリのstd::async関数(→id:yohhoy:20120203)std::launch::asyncポリシーと、同関数が返すstd::futureオブジェクトの動作についてメモ。本記事はStack Overflow上での質問と回答内容に基づく。要約:async関数動作でlaunch::asyncポリシーが…
2012-11-29追記:2012年11月リリース"Visual Studio 2012 Update 1"により、Visual Studio 2012(MSVC11)でもWindows XP上で動作可能なアプリケーションを作成可能となった。 → MSDN Blog - Visual Studio 2012 の Update 1 がご利用いただけるようになりまし…
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>…
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>…
Intel TBBをgcc C++0xモード(-std=c++0xオプション付)でビルドする方法。gcc 4.6.3+tbb40_20120201oss_src.tgz (TBB 4.0 update 3) @Ubuntu 11.10で確認済み。${TBBROOT}/src/index.htmlに記載がある通り、makeオプションに cpp0x=1 を追加指定する*1。 …
yamasaさんのDCL解説記事で知った、「C++11規格においてブロックスコープなstatic変数の初期化処理はマルチスレッドセーフ」に関するメモ。該当箇所をN3337 6.7/p4より一部引用。(下線部は強調) Otherwise such a variable is initialized the first time …
C++標準ライブラリの future/promise を利用してone-shotイベントを実現する。本記事での “one-shotイベント” は、1度しか使えないスレッド間イベント待機/通知機構を指している。環境依存の実装であれば、WaitForSingleObject/SetEvent(Windows API)やse…
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>…
C++11標準ライブラリのスレッドサポートライブラリ定義で用いられるDECAY_COPY関数に関するメモ*1。2021-10-21追記:C++2b(C++23)に向けた提案文書 P0849R8 が採択され、decay-copy動作を行う明示型変換(explicit type conversion)式auto(t), auto{t}が言語…
Intel TBB(Threading Building Blocks)およびMicrosoft PPL(Parallel Pattern Library)と、タスク内からのブロッキングAPI呼び出しに関するメモ。まとめ: TBBのスケジューラは協調的マルチタスクを行うため、タスク内から長期間ブロックする処理を呼び出す…
プログラミング言語C/C++では、関数実引数の評価順序は未規定(unspecified)となっている。標準規格における言及箇所のメモ。2018-02-02追記:C++17仕様では未規定(unspecified)から “不定順の順序付け(indeterminately sequenced)” に変更され、関数実引数の…
Visual Studio 11(MSVC11) Betaの可変長引数テンプレート(Variadic Templates)対応*1についてメモ。結論:言語機能としてはサポート一切なし。ただしC++標準ライブラリの一部をマクロでエミュレーション。MSVC12(?)に期待。MSVC11 C++ライブラリの既定では…
Visual Studio 11(MSVC11) Betaにおいて、C++11ラムダ式とWindows APIコールバック関数を組み合わせを試したのでメモ。C++11仕様“変数キャプチャを伴わないラムダ式は関数ポインタに変換可能”を利用し、コールバック関数を指定するWindows API関数へラムダ式…