它有效(定義的行爲)與多線程同時訪問字符串文字嗎?鑑於這樣的功能:線程和字符串文字
const char* give()
{
return "Hello, World!";
}
會是保存到調用函數和取消引用同時指針?
編輯:很多答案。將接受第一個可以向我展示該部分的標準。
它有效(定義的行爲)與多線程同時訪問字符串文字嗎?鑑於這樣的功能:線程和字符串文字
const char* give()
{
return "Hello, World!";
}
會是保存到調用函數和取消引用同時指針?
編輯:很多答案。將接受第一個可以向我展示該部分的標準。
根據標準:
C++ 11 1.10/3:對象在特定點到線T可見的值是所述物體的初始值,分配給一個值根據下面的規則,由T或由另一個線程分配給對象的值創建對象。
與其他任何常量對象一樣,字符串文字不能合法地分配給;它具有靜態存儲持續時間,並且在程序啓動之前被初始化;因此,所有線程始終都會看到其初始值。
老的標準對線程沒有什麼可說的;所以如果您的編譯器不支持C++ 11線程模型,那麼您必須查閱其文檔以獲取任何線程安全保證。然而,很難想象任何實現對不可變對象的訪問都不是線程安全的。
是的,它是安全的。爲什麼不呢?如果您嘗試修改字符串,這將是不安全的,但無論如何這是違法的。
只要你只讀取數據,你可以從任意多的線程訪問它。當數據需要改變時,就是變得複雜。
這取決於C編譯器的實現。但是我不知道併發讀訪問可能不安全的實現,所以實際上這是安全的。
字符串文字(概念上)存儲在只讀存儲器中,並在加載時(而不是在運行時)初始化。因此可以隨時從多個線程訪問它們。
請注意,更復雜的結構可能不會在加載時初始化,因此多個線程訪問可能在創建對象後立即發生問題。
但字符串文字是完全安全的。
從多個線程訪問不可變數據總是安全的。字符串文字是不可變數據的一個例子(因爲在運行時修改它們是非法的),所以從多個線程訪問它們是安全的。
...始終安全* *施工完成後*破壞開始前(這是未定義的行爲) – 2012-03-02 13:11:05
你可能會添加一個提示字符串文字具有靜態生命週期,所以它們是在程序啓動之前創建的,直到它結束;有關施工的可能問題也不會發生。 – 2012-03-02 12:46:02
您是否知道標準中的哪些部分(使用線程的讀取訪問權限)被定義?我找不到任何東西。 – cooky451 2012-03-02 12:47:49
@ cooky451我懷疑你會在這個標準中找到任何東西。 – 2012-03-02 12:48:57