スレッドセーフの定義

# 茶々入れ、失礼。m(_ _)m > id:y-hamigaki

[Hamigaki]設計方針

「何を以ってスレッドセーフとするか明示していないライブラリは怖くて使えない!」と言いつつ、自分のライブラリに何も書いてなかったので設計方針をドキュメントに追加しました。

確かにそうようだよなぁ...と、思いつつ、自分が作るライブラリの参考にさせて頂こうかと定義を拝見させて頂いたのですが...

第4章 設計方針

あるオブジェクトに対し、あらゆるタイミングで、

  • 単一スレッドからの書き込み (非constメソッドの呼び出し)
  • 複数スレッドからの読み出し (constメソッドの呼び出し)

のうち高々一方の操作しか行われないことをライブラリユーザーが保証する限り、マルチスレッド環境でも正しく動作する。

...ちょっと自分が思い描くものとは観点にズレがあるなぁと。グローバル(orスタティック)変数依存なものでも無い限り、上記定義は多くの場合特に意識しなくても一応は守られることにはなる類のことだし、前提条件や"正しく動作する"ということの定義が弱いかなぁと。

例えば、前提条件として各スレッド毎に初期化・終了関数を呼び出す必要があるのか否か?と言った点や、"正しく動作する"という文面から、上記のアクセスルールさえ守っていれば問題ないんだと素人考えで memcpy(buffer, obj.data(), obj.size()); なんて類のことをやられたらスレッドセーフも糞もないし。(この memcpy() が確実且つ安全に成功する為にはロックが必要)

あと、"正しく動作する" の定義によっては「対象のオブジェクトが volatile 修飾されている場合に限る」といった文面も必須かと。(volatile修飾されていないと最適化により問題が発生しうる)


...ホント、こーゆー定義って面倒な上に慎重にやらないと穴ができやすいんだよなぁ。