yohhoyの日記

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

2012-03-01から1ヶ月間の記事一覧

Windows XP向けの条件変数の実装方法と実例

Windows XP以前のWindows APIでは同期プリミティブとしての条件変数(condition variable)が提供されない。セマフォ(semaphore)やミューテックス(mutex)/クリティカルセクション*1を組み合わせて、条件変数プリミティブを実装するアルゴリズムおよびコード実…

(翻訳)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…

0xCAFEBABE

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 …

タイムアウト付き待機関数とspurious wakeupの微妙な関係

C++

C++11標準ライブラリの条件変数std::condition_variableおよびstd::condition_variable_anyは仕様上 spurious wakeup を許容する(→id:yohhoy:20120326)。このため条件変数のタイムアウト付き待機関数wait_until, wait_forの動作において、「通知を受けてい…

条件変数とspurious wakeup

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

mutexの制約とバイナリセマフォ

C++

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追記:エクセルソフトよ…

STLアルゴリズムのParallel Mode拡張

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…

電子書籍"Parallel Programming with Microsoft Visual C++"

Microsoft PPL/Agents/ConcRT*1を利用した並列プログラミングに関する電子書籍。HTML版がMSDNにて無償公開されている。 Parallel Programming with Microsoft® Visual C++® -- Design Patterns for Decomposition and Coordination on Multicore Architectur…

async関数launch::asyncポリシーとfutureのちょっと特殊な動作

C++

C++11標準ライブラリのstd::async関数(→id:yohhoy:20120203)std::launch::asyncポリシーと、同関数が返すstd::futureオブジェクトの動作についてメモ。本記事はStack Overflow上での質問と回答内容に基づく。要約:async関数動作でlaunch::asyncポリシーが…

VisualStudio11作成アプリをWinXP上で動作させるHACK

2012-11-29追記:2012年11月リリース"Visual Studio 2012 Update 1"により、Visual Studio 2012(MSVC11)でもWindows XP上で動作可能なアプリケーションを作成可能となった。 → MSDN Blog - Visual Studio 2012 の Update 1 がご利用いただけるようになりまし…

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>…

C++11サポートを有効にしてIntel TBBをビルド

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。 …

static変数初期化とスレッドセーフ

yamasaさんのDCL解説記事で知った、「C++11規格においてブロックスコープなstatic変数の初期化処理はマルチスレッドセーフ」に関するメモ。該当箇所をN3337 6.7/p4より一部引用。(下線部は強調) Otherwise such a variable is initialized the first time …

future+promiseでone-shotイベント

C++

C++標準ライブラリの future/promise を利用してone-shotイベントを実現する。本記事での “one-shotイベント” は、1度しか使えないスレッド間イベント待機/通知機構を指している。環境依存の実装であれば、WaitForSingleObject/SetEvent(Windows API)やse…

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>…

DECAY_COPY

C++

C++11標準ライブラリのスレッドサポートライブラリ定義で用いられるDECAY_COPY関数に関するメモ*1。2021-10-21追記:C++2b(C++23)に向けた提案文書 P0849R8 が採択され、decay-copy動作を行う明示型変換(explicit type conversion)式auto(t), auto{t}が言語…

TBBとPPL/ConcRTとブロッキング操作

Intel TBB(Threading Building Blocks)およびMicrosoft PPL(Parallel Pattern Library)と、タスク内からのブロッキングAPI呼び出しに関するメモ。まとめ: TBBのスケジューラは協調的マルチタスクを行うため、タスク内から長期間ブロックする処理を呼び出す…

C/C++関数引数の評価順序

C C++

プログラミング言語C/C++では、関数実引数の評価順序は未規定(unspecified)となっている。標準規格における言及箇所のメモ。2018-02-02追記:C++17仕様では未規定(unspecified)から “不定順の順序付け(indeterminately sequenced)” に変更され、関数実引数の…

Visual Studio 11 BetaのVariadic Templatesエセ対応

Visual Studio 11(MSVC11) Betaの可変長引数テンプレート(Variadic Templates)対応*1についてメモ。結論:言語機能としてはサポート一切なし。ただしC++標準ライブラリの一部をマクロでエミュレーション。MSVC12(?)に期待。MSVC11 C++ライブラリの既定では…

Windows APIコールバックでのラムダ式の利用

Visual Studio 11(MSVC11) Betaにおいて、C++11ラムダ式とWindows APIコールバック関数を組み合わせを試したのでメモ。C++11仕様“変数キャプチャを伴わないラムダ式は関数ポインタに変換可能”を利用し、コールバック関数を指定するWindows API関数へラムダ式…