yohhoyの日記

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

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

P/Invokeの呼び出し規約+文字セット指定

C#からのP/Invokeにおける関数呼び出し規約、文字セット(MBCS/UNICODE)の指定方法についてメモ。P/Invoke既定の呼び出し規約はCallingConvention.StdCallとなっており、アンマネージド側が__stdcallならば明示指定は必須でははない。*1 P/Invoke既定の文…

C#でstrong typedefもどき

C#

プログラミング言語C#でstrong typedef("強い"型の別名)っぽいものを自前で実装する方法。C# feature request: strong typedefs | Microsoft Connectよりサンプルコード引用。この要求は "by design" でクローズされている。 struct EmployeeID { private …

Intel TBBのscalable_allocator設計

TBB

Intel TBB(Threading Building Blocks)が提供する tbb::scalable_allocator の説明資料がIntelより公開されている。 http://www.intel.com/technology/itj/2007/v11i4/5-foundations/5-memory.htm (PDF)The Foundations for Scalable Multi-Core Software in…

本当は怖いfuture+promiseの話

C++

C++11標準ライブラリのstd::future+std::promiseクラス利用に関して、不適切な使用パターンに起因するやっかいな不具合についてメモ。この不具合はマルチスレッドプログラムの未定義動作(undefined behavior)により引き起こされる。下記例のように一見関係…

volatile変数とマルチスレッドとの関係についての押し問答(前編)

C++

プログラミング言語C++のvolatile変数がスレッド間の同期機構として機能するか否かという論点について、有りそうな質問とその答えについての簡易メモ。(自身の思考整理用)結論:このプログラムは可搬性が無く、未定義動作(undefined behavior)を引き起こす…

再帰ミューテックスの実装3つ

C++

C++11標準ライブラリを用いた再帰ミューテックスrecursive_mutexクラスの内部実装 3パターン。標準ライブラリが提供するstd::recursive_mutexの再実装。各実装で利用している同期プリミティブ #1: std::mutex+std::condition_variable #2: 2個のstd::mutex …

C++1yへの並列アルゴリズムライブラリ提案

C++1y(C++14)に向けた並列プログラミングモデルについてメモ。(PDF)N3429 A C++ Library Solution to Parallelismにて、いくつか並列アルゴリズムの追加提案がなされている(言語コア機能の拡張提案は含まない)。初期提案のため概要レベル。2021-03-17追記…

ラベル名と識別子名

C C++

プログラミング言語C/C++のラベル(label)名は、他の識別子名(関数名や変数名など)と独立した名前空間*1を持つ。 void f() { /* foo statement */; std: // OK /* bar statement */; } C++03 6.1/p1より該当箇所を引用。 (snip) Labels have their own name…

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

async関数launch::asyncポリシーとfutureのちょっと特殊な動作の後日談。 async関数動作でlaunch::asyncポリシーが選択された場合のみ、futureオブジェクトのデストラクタではasync関数が作成した新スレッド完了を待機する。(暗黙的にスレッドjoinが行われ…

Windows APIのクリティカルセクションはFIFO動作しない

Windows API提供の排他制御プリミティブCRITICAL_SECTIONでは、ロック競合スレッド間のケジューリングにおいてFIFO順序が保証されない。*1下記コードで「処理(1)が2スレッド上で交互に実行される」ことを期待した場合、Windows XP以前では予想通りの実行結果…

C++ Stream Mutex

C++標準ライブラリのストリームに対する並行入出力操作において、明示的ロックを用いない排他制御の方法について。2017-11-21追記:C++2a(C++20)標準ライブラリに向けて、同期化出力ストリームが採択された(→id:yohhoy:20171121)。本記事で取り上げたN3395…

Boost.Asioのstrand

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

ヌルポインタの内部表現

C

プログラミング言語Cにおけるヌルポインタ値の内部表現(≒ビット表現)に関して、標準規格では特に規定しておらずその内部表現は非ゼロであっても良い。*1注意:定数値0はヌルポインタ定数として解釈されるが、ここで言う “ヌルポインタの内部表現” とは関係…

shared_ptr相互乗り入れ

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

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

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

Reader-Writerロックの実装

C++11標準ライブラリのスレッドサポートを利用して実装されたReader-Writerロック(Shared/Upgradeロック)。Boost Software License。Howard Hinnant氏の記事Handling mutexes in C++に詳しい解説あり。 http://home.roadrunner.com/~hinnant/mutexes/share…

関数パラメータリストと配列型

C C++

C/C++言語における関数パラメータリスト中の配列型に関するメモ。下記の関数f1, f2はどちらの宣言でも同じ関数(同一の型)として扱われる。 void f1(int a[42], const char b[]); void f1(int * a, const char * b); // a = int型へのポインタ型, b = const…

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

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

tbb::flow::sequencer_nodeとsequence order numberの落とし穴(続き)

前記事ではフローグラフによる実装を行ったが、この設計ならばで並列パイプラインアルゴリズム parallel_pipeline の方が簡潔に記述できる。というより、この手の線形パイプライン処理はパイプライン(pipeline)アルゴリズムで実装すべき。 #include <iostream> #includ</iostream>…

tbb::flow::sequencer_nodeとsequence order numberの落とし穴

Intel TBB フローグラフ(flow graph)のシーケンサノード sequencer_node では、入力アイテムからシーケンス序数(sequence order number)を返すユーザ定義のSequencerファンクタを与えて、後続ノードへ送るアイテム順序を変更する。このシーケンス序数の割当…

C++0x標準ライブラリへの要望リスト(だったもの)

C++

C++0x(現C++11)標準ライブラリに向けて過去挙げられた機能Wishlist。実際に追加されたものから、題目のみで終わったものまで様々。 This is a list of suggested additions to the standard C++ library for the next version of C++ ("C++0x"). This list…

可変引数リストと非PODクラス型の関係

プログラミング言語C++において、可変引数リスト(...; ellipsis)をとる関数に非PODクラス型を渡した場合の振る舞いについてメモ。 void foo(int, ...); std::string s; foo(1, s); // ?? C++03 可変引数リストに非PODクラス型を渡した場合、未定義動作(undef…

標準入出力とchar/wchar_t型の混在

C C++

C/C++標準ライブラリの標準入出力ストリームにおける char/wchar_t 型混在についてメモ。またはCの printf/wprintf 関数、C++の cout/wcout オブジェクト混在利用に関する話題。まとめ:ある標準入出力ストリームに対する char/wchar_t 入出力操作の混在…

NULL-NULL=?

C C++

C/C++言語におけるヌルポインタ同士の減算に関するメモ。 int *p = NULL, *q = NULL; ptrdiff_t x = (p - q); // x == 0 ? まとめ: C言語仕様上は未定義動作(undefined behavior)。とはいえ、大半の処理系では値0になると予測される(単に経験則)。 C++言…

std::regexチートシート

C++

C++11標準ライブラリに追加された正規表現ライブラリstd::regex(std::basic_regexクラステンプレート) のチートシート。PDF形式。 C++11 regex cheatsheet

std::vectorのサイズ指定初期化

C++

C++標準ライブラリのシーケンスコンテナstd::vectorに関して、C++03/11でのサイズ指定コンストラクタ差異に関するメモ。 114 :デフォルトの名無しさん:2012/08/01(水) 10:00:54.97 >>111 vector(n), vector::resize(n) について。C++03 では (n, value) と…

unlock操作とデストラクト処理のスキマ

C++

C++11標準ライブラリのミューテックスクラスと、unlock操作〜オブジェクト破棄で起こり得る挙動についてメモ。注意:ミューテックスクラスの内部実装に対する要件の話であり、標準ライブラリ利用者にとっては “意図通り” 動作することが保証されている。(言…

浮動小数点数比較マクロ

C C++

C99で追加された浮動小数点数比較マクロについてメモ。同機能はC++11においても提供される。比較マクロとそれに対応する比較演算の一覧。組込みの比較演算子では浮動小数点数例外(floating-point exception)が発生する可能性があるが、比較マクロでは決して…

NRVO(copy elision)と関数パラメータ変数

C++

C++11標準規格で許容される最適化 "copy elision"*1 と、関数パラメータ(仮引数)変数との関係についてメモ。 return文に関数パラメータ変数を指定しても、コンパイラにて "copy elision" が行われることは無い*2。つまり戻り値オブジェクト生成のために、必…

古のK&R C in 2012

2012年現在のC言語コンパイラでもK&R Cソースコードを扱えるか試したのでメモ。*1結論:gccとMSVCはK&R Cソースコードでもコンパイル可能。 /* K&R style C */ int printf(); int add(); main(argc, argv) int argc; char** argv; { printf("1+2=%d\n", add(…