yohhoyの日記

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

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

文字列を含む構造体のP/Invoke

P/Invokeにおいて “メンバ変数として文字列データを含む構造体” をマネージドコード(C#)からアンマネージド(native)関数へ渡す方法メモ。注意:本記事中のC#コードでは例外安全を考慮しておらず、確保したメモリブロックのリークが発生しうる。メモ:アンマ…

C#のusingステートメント

C#

プログラミング言語C#におけるusingステートメント利用に関するメモ。基本形は下記の通り。型TはIDisposableインタフェースを実装する必要がある。 using (var t = new T(...)) { /* * tを使った処理 */ } // t.Dispose()が呼ばれる 複数リソースを扱う例: …

P/Invokeとパラメータ方向属性

C#からのP/Invokeにおけるパラメータの方向属性*1についてメモ。C#における既定の方向属性は下表のとおり。呼び出し元/呼び出し先はマネージド(C#)/アンマネージド(native)いずれかになる。つまりexternメソッド呼び出しであればC#→nativeとなり、アンマネ…

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以前では予想通りの実行結果…