複数のスレッドと同時に文字列リテラルにアクセスすることは有効ですか?与えられた関数は次のようになります:スレッドと文字列リテラル
const char* give()
{
return "Hello, World!";
}
関数を呼び出してポインタを逆参照することはできませんか?
編集:多くの回答。私は標準のセクションを私に見せてくれる最初の人を受け入れます。
複数のスレッドと同時に文字列リテラルにアクセスすることは有効ですか?与えられた関数は次のようになります:スレッドと文字列リテラル
const char* give()
{
return "Hello, World!";
}
関数を呼び出してポインタを逆参照することはできませんか?
編集:多くの回答。私は標準のセクションを私に見せてくれる最初の人を受け入れます。
:
C++ 11 1.10/3:特定の時点でスレッドTに見えるオブジェクトの値が割り当てられた値は、オブジェクトの初期値であります次の規則に従って、オブジェクトをTで、または別のスレッドによってオブジェクトに割り当てられた値に置き換えます。
文字列リテラルは、他の定数オブジェクトと同様に、法的に割り当てることができません。それは静的記憶期間を有し、従ってプログラム開始前に初期化される。したがって、すべてのスレッドは常にその初期値を参照します。
以前の標準ではスレッドについて何も言及していませんでした。コンパイラがC++ 11スレッディングモデルをサポートしていない場合、スレッドセーフな保証についてはそのドキュメントを参照する必要があります。しかし、不変オブジェクトへのアクセスがスレッドセーフではない実装を想像するのは難しいです。
はい、安全です。それはなぜでしょうか?あなたが文字列を修正しようとすると危険ですが、とにかくそれは違法です。
データを読み取るだけであれば、必要な数のスレッドからデータにアクセスできます。データを変更する必要がある場合は、複雑になる場合があります。
これは、Cコンパイラの実装によって異なります。しかし、私は同時読み込みアクセスが安全でないかもしれない実装を知らないので、実際には安全です。
文字列リテラルは(概念的に)読み取り専用メモリに格納され、(実行時ではなく)読み込み時に初期化されます。したがって、いつでも複数のスレッドからアクセスすることは安全です。
ロード時に、より複雑な構造が初期化されない可能性があるため、オブジェクトの作成直後に複数のスレッドアクセスで問題が発生する可能性があります。
しかし、文字列リテラルは完全に安全です。
複数のスレッドから不変のデータにアクセスすることは常に安全です。文字列リテラルは、不変のデータの例です(実行時に変更するのは不正です)、複数のスレッドからアクセスすることは安全です。標準によれば
...常に安全* after * constructionが完了し、* before * destroyが開始されます(これは未定義の動作です) –
文字列リテラルに静的な有効期間があるので、プログラムが開始する前に作成され、終了するまで実行されることを通知することができます。建設に関する可能性のある問題は発生しません。 –
標準のどのセクションでスレッドとの読み込みアクセスが定義されているのか知っていますか?私は何も見つけることができませんでした。 – cooky451
@ cooky451私はあなたがこれに関して標準で何かを見つけるのではないかと疑います。 –