タグ

2006年11月12日のブックマーク (3件)

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

    複数のスレッドから共有する変数(典型的にはグローバル変数)を操作する際、どんな注意事項があるか?という話題です。プラットフォームはPOSIXを仮定します。pthreadのお話です。 まず、一口に「複数のスレッドで変数を共有」といっても、おおまかにいって次のような状況が考えられます。 読むスレッドしか存在しない 読むスレッド、書くスレッドの両方が存在する 書くスレッドは、read-modify-write動作を行う 書くスレッドは、read-modify-write動作を行わない 変数の更新(メモリ操作)がアトミックに行える*1 変数の更新(メモリ操作)がアトミックに行えない*2 順に見ていきましょう。観点は、「(1) volatile修飾が必要か」「(2) mutexによるロックが必要か」の2点です。 まず、「1. 読むスレッドしか存在しない」ケース。例えば、 static const c

    マルチスレッドと共有変数 - volatile?なにそれ。 - memologue
    kotak
    kotak 2006/11/12
    「(1) volatile修飾が必要か」「(2) mutexによるロックが必要か」
  • memologue - UNIX上でのC++ソフトウェア設計の定石 (2)

    鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ」関数の呼び出し これ以外の処理を記述しないこと! 説明: シグナル受信時に何らかの処理を行うためには、シグナルハンドラと呼ばれる関数を用意し、それをsigaction関数でシグナル名と紐付けておけばOKです。しかし、シグナルハンドラ内で行ってよい処理は、上記の通り非常に限定されています。これを把握しないまま奔放なコードを書くと次のような現象が起き得ます: 問題1: プログラムがデッドロックする危険がある タイミングに依存する、再現困難なバグの原因となる デッドロックの発生が典型例だが、それ以外にも関数の戻り値不正

    memologue - UNIX上でのC++ソフトウェア設計の定石 (2)
    kotak
    kotak 2006/11/12
    鉄則2: シグナルハンドラで行ってよい処理:次の3つの処理だけが許されている。1. 自動変数の操作2.“volatile sig_atomic_t”型の大域変数の操作3.「非同期シグナルセーフ」関数の呼び出し
  • UNIX上でのC++ソフトウェア設計の定石 (6) - memologue

    鉄則6: マルチスレッドプログラミングの「常識」を守ろう POSIXの標準関数のうち、非スレッドセーフであるものの一覧を把握し、使わないようにせよ 自作の関数はスレッドセーフにせよ 共有変数はロックして参照・更新せよ C++を使っているなら、関数を同期化する方法に注意せよ 説明: (1) POSIXの標準関数のうち、非スレッドセーフであるものの一覧を把握し、使わないようにせよ もしPOSIXプラットフォームでマルチスレッドのプログラミングを行うなら、いくらかの最低限の知識、つまり「常識」を知り、厳守する気持ちで望みましょう。 ...まずは、「スレッドセーフ」の意味を理解しましょう。スレッドセーフな関数とは、「複数のスレッドが同時に呼び出しても問題ない関数のこと」です。こういう関数は次のどちらかの性質を満たしています。 局所的静的変数(関数内のstatic変数)や非局所的静的変数(大域変数)

    UNIX上でのC++ソフトウェア設計の定石 (6) - memologue
    kotak
    kotak 2006/11/12
    スレッドセーフ