この質問は、私が何年も続けてきた慣習に疑問を投げかけました。
関数ローカル静的定数オブジェクトのスレッドセーフな初期化のために、オブジェクトの実際の構築を保護しますが、それを参照する関数ローカル参照の初期化は保護しません。このようなもの:
namespace {
const some_type& create_const_thingy()
{
lock my_lock(some_mutex);
static const some_type the_const_thingy;
return the_const_thingy;
}
}
void use_const_thingy()
{
static const some_type& the_const_thingy = create_const_thingy();
// use the_const_thingy
}
ロックには時間がかかるという考え方であり、参照が複数のスレッドによって上書きされても問題ありません。
これがあれば興味があります
- 実際には十分安全ですか?
- ルールに従って安全ですか?(私は知っています、現在の標準は「並行性」が何であるかさえ知りませんが、すでに初期化された参照を踏みにじることはどうですか?そしてPOSIXのような他の標準はこれに関連する何かを言いますか?)
これを知りたいのは、コードをそのままにしておくことができるのか、それとも戻って修正する必要があるのかを知りたいからです。
探究心のために:
私が使用したそのような関数ローカル静的constオブジェクトの多くは、最初の使用時にconst配列から初期化され、ルックアップに使用されるマップです。たとえば、タグ名の文字列がenum
値にマップされるXMLパーサーがいくつかあるので、後でswitch
タグのenum
値を上書きできます。
代わりに何をすべきかについていくつかの答えを得ましたが、実際の質問に対する答えが得られなかったので(上記の1.と2を参照)、これについて報奨金を開始します。繰り返しますが、私は代わり
に何ができるかに興味がありません。私はこれについて本当に知りたいです。