C++

g++ exception handling

C++

Code Project という有名サイトに、VC++の例外処理方法に関する記事があります (http://www.codeproject.com/cpp/Exceptionhandler.asp) が、そこにg++の例外処理方法を解説したコメントがありました。 ざっくりと次のような事を言っています(翻訳してるわけ…

UNIX上でのC++ソフトウェア設計の定石 (5)

C++

鉄則5: スレッドの「遅延キャンセル」も出来る限り避けて通ろう スレッドの非同期キャンセルとは:あるスレッドが別のスレッドに処理の中断を依頼すること 遅延キャンセルは、規格の自由度が比較的高いため、OSやCライブラリのバージョンにより動作がまちま…

UNIX上でのC++ソフトウェア設計の定石 (4)

C++

鉄則4: スレッドの「非同期キャンセル」を行わない設計にしよう スレッドの非同期キャンセルとは: あるスレッドが別のスレッドを即座に強制終了すること 単に「設計が楽だから」「シンプルになるから」という理由でスレッドの非同期キャンセルを使うのはや…

UNIX上でのC++ソフトウェア設計の定石 (3)

C++

鉄則3: マルチスレッドのプログラムでのforkはやめよう マルチスレッドのプログラムで、「自スレッド以外のスレッドが存在している状態」でfork*1を行うと、さまざまな問題を引き起こす可能性があります。「問題」の典型例としては、子プロセスのデッドロッ…

C++でsynchronized methodを書くのは難しい (3)

C++

方式cの改良です。まず、「初期化順」の問題を避けるためには、コンストラクタを呼び出すことなく初期化が済んでいるオブジェクトでなければなりません。そのためには、mutexオブジェクトを // 方法c' (仮) void Foo::need_to_sync(void) { static StaticMut…

C++でsynchronized methodを書くのは難しい (2)

C++

「いや、メソッドの同期化など頻繁に必要になるはずだ、便利な方法がないわけがない」と仰る方もいるでしょう。はい、あります。一般的な方法は、 (non-POD型の、つまり普通の)C++のクラスとして「Mutexクラス」を用意する クラス変数、あるいはグローバル変…

C++でsynchronized methodを書くのは難しい (1)

C++

Javaにはsynchronizedという便利なキーワードがあります。このキーワードを使うと、例えば次のように簡単にメソッドを「同期化」することができます。同期化されたメソッドは、複数のスレッドで同時に実行されることがありません。 public class Foo { ... p…

UNIX上でのC++ソフトウェア設計の定石 (2)

C++

鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ…

UNIX上でのC++ソフトウェア設計の定石 (1)

C++

UNIXは、Windowsなどの“開発者に優しい”OSと比較すると、シグナルやスレッドの利用に関して制限事項が多いですが、それを知らずにアーキテクチャ設計および実装を行ってしまうケースが散見されます。これは、再現困難なバグの温床となるでしょう。 そこで、…

enbug

C++

「バグ修正による、別の問題の発生」を何と呼ぶかは組織によって微妙に違うと思いますが、ひとまず「エンバグ(enbug)」は和製英語のようで、要注意ですね。 http://www.enbug.org/ 「デグレード(degrade)」あるいは「デグレ」は動詞だし、「リグレッション(r…

非同期シグナルとanti-pattern

C++

sigsafeというUNIX向けの小さなライブラリがあります。これは、「シグナルを正確に取り扱うのは非常に難しい、俺たちのライブラリを使うと随分楽になるよ」といった趣旨の、アセンブラとCで書かれたライブラリで、それなりの種類のOS、CPUがサポートされてい…

ライブラリの評価 (3)

C++

例外安全性については定番書籍、Exceptional C++ (ASIN:4894712709)が参考になります。標準C++との親和性の高いライブラリの例としては、Notus (http://notus.sourceforge.net/) を挙げておきます。"static initialization order fiasco" についてご存知ない…

ライブラリの評価 (2)

C++

あるライブラリをプロジェクトで使用するかどうか決める場合、まずはそのライブラリの合目的性や実績、サポート、ドキュメントの充実度、ライセンス、提供次期、価格などを検討しますが、私はその後で、そのライブラリの "C++ライブラリとしての素性の良さ" …

ライブラリの評価 (1)

C++

美しいフレームワークがそろっているJava界隈と異なり、私のいるような業界では、何もない状態、無から短期間で製品をリリースしなければいけません。この状況の改善はエロい人々におまかせするとして、そういう状況下の開発過程で使用を勧められる様々なサ…

strict aliasing

C++

GCC-3.5には -Wstrict-aliasing=2 というオプションが指定できる模様。これで、以前に書いた-fstrict-aliasingにまつわる不具合をコンパイル時に検出できるようになるかもしれない。

(続き) 2ちゃんねる、GCCスレより

ふーむ。-fcall-saved-XXX ってのは知らなかったな。「(calling conventionを)普通CPUメーカーが決める」という件についてはそうですね。x86についても「IA-32 インテル(R)アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻」の6章、「プロシ…

The history of calling conventions

MSの中の人のblogとして著名な、"The Old New Thing" の2004年1月の記事に、calling convention関係のものが5つある。あとで必ず読まねば。

マルチスレッドと共有変数 (続き) -- 補足 (3)

C++

シグナルハンドラからアクセスするグローバル変数は、ちゃんと volatile sig_atomic_t 型にしないとダメですよ!(追記 2006/1/20) またも書き忘れ。longjmp, _longjmp, siglongjmpで戻ってきた後に触りたい自動変数もvolatileつけないとだめですYO!

マルチスレッドと共有変数 (続き) -- 補足 (2)

C++

Singletonを実装する時などで、いわゆる "double checked locking" を使うなんて場合は、memory sync な関数を使わない部分が出てくるでしょうから、volatile やら コンパイラ固有のメモリバリア手法やらをキッチリ使わないとダメですよ〜。多分。 参考: The…

マルチスレッドと共有変数 (続き) -- 補足 (1)

C++

SUSv3をひっぱりだすのが大げさという場合は、comp.programming.threads FAQ の、 Q.56: Why don't I need to declare shared variables VOLATILE? Q.118: Memory barriers for synchonization あたりを読んでもらうと良いです。特にQ.56ですね。 あと、以上…

マルチスレッドと共有変数 (続き) -- およびvolatile修飾の必要性

C++

複数のスレッドで変数を共有し、さらにその変数に対してread/writeの両方のオペレーションが行われるとき、その変数の操作は、上で書いたとおり、 read/writeともにmutexで保護するべき volatile修飾だけで済ませるのはNG mutexで保護するならvolatile修飾は…

マルチスレッドと共有変数 - volatile?なにそれ。

C++

複数のスレッドから共有する変数(典型的にはグローバル変数)を操作する際、どんな注意事項があるか?という話題です。プラットフォームはPOSIXを仮定します。pthreadのお話です。 まず、一口に「複数のスレッドで変数を共有」といっても、おおまかにいって次…

(続き) 仮想関数のインライン化

散々言われている事とは思うけども、仮想関数もインライン展開の対象に なる ので要注意です。 値オブジェクトのメソッドが呼ばれている場合は実行時に動的束縛する必要がないからインライン化できます。Foo::bar() が仮想関数として、 Foo f; f.bar(); はイ…

(続き) ctor/dtorに関する注意

コンストラクタ、デストラクタをコンパイラに自動生成させる場合、当然かもしれませんがそれらはインライン化されます。インライン化というか何も処理が発生しないというか。 しかしもちろん、 [foo.h] class Foo { public: Foo(); ~Foo(); }; [foo.cpp] Foo…

関数のインライン化基準

C++/C99言語では、"inline"キーワードが正式にサポートされており、コンパイラに対して関数を「インライン化してほしい」と要求することができます。しかし、良く知られていることですがこれはあくまでヒントなので、コンパイラの気分次第でインライン化が起…

valgrind

C++

とりあえず、次のオプションで落ち着いている。 valgrind -v --num-callers=100 --leak-check=yes \ --leak-resolution=high --error-limit=no \ --workaround-gcc296-bugs=yes 最後のは太古のg++使用時のみ。誰かARMやMIPSに移植してくれないかなぁ・・。

type punning と strict aliasing

/.JのGCC-3.4リリースの話題を追っていたら、GCC3では-O2で-fstrict-aliasingが有効だから注意せよというポスト(http://slashdot.jp/comments.pl?sid=175355&cid=537217)があった。strict aliasing については、Radium Software Developmentさんが詳しい。こ…

コンパイル時に文字列リテラルに指定のアルゴリズムによる計算を施し、整数に変換するには?

頭の体操です。 int main(void) { return CompileTimeHash("abcdefghijklmnopqrstu"); }が、 mov $12345, %eax のような形にコンパイルされればOKとします(最適化をかけて即値になればOK)。テンプレートの再帰を使うことになると思いますが、再帰がunrollさ…

GNU Nana

C++

GNU nana: improved support for assertion checking and logging in GNU C/C++という、C/C++のデバッグライブラリがある。開発は1999年以降止まっている模様だが、「達人プログラマ」でも紹介されている、ユニークな考え方のライブラリです。日本語の解説は…