標準ライブラリのコンテナはスレッドセーフではないという事実を知っています。それによって、私は、たとえばタイプのコンテナには、std::list
複数のスレッドが同時にアクセスできないと考えていました(その一部はコンテナを変更する可能性があります)。しかし今では、目に見える以上のものがあるようです。少なくとも私にとっては、もっと微妙なもの、それほど明白ではないもの。
たとえば、最初の引数を値で受け入れるこの関数について考えてみます。
void log(std::string msg, severity s, /*...*/)
{
return; //no code!
}
これはスレッドセーフですか?
最初は、関数本体が共有の変更可能なリソースにアクセスしないため、スレッドセーフであるように見えます。したがって、スレッドセーフです。考え直してみると、このような関数を呼び出すstd::string
と、最初の引数である型のオブジェクトが作成されます。このオブジェクトの構築は、内部でを使用するため、スレッドセーフではないと思いますstd::allocator
。スレッドセーフではないと思います。したがって、このような関数を呼び出すこともスレッドセーフではありません。しかし、それが正しければ、これはどうでしょうか。
void f()
{
std::string msg = "message"; //is it thread-safe? it doesn't seem so!
}
私は正しいですか?マルチスレッドプログラムで使用できますかstd::string
(または内部で使用するコンテナ)?std::allocator
私は特に、共有オブジェクトではなく、ローカル変数としてのコンテナーについて話しています。
私はグーグルを検索し、具体的な答えがないまま、多くの同様の疑問を見つけました。私は彼と同様の問題に直面しています:
C++03とC++11の両方を検討してください。