使用多个线程同时访问字符串文字是否有效(已定义的行为)?给定这样的函数:
const char* give()
{
return "Hello, World!";
}
是否可以保存以调用该函数并同时取消引用指针?
编辑:很多答案。接受第一个可以向我展示标准部分的人。
答案 0 :(得分:4)
根据标准:
C ++ 11 1.10 / 3:特定点处线程T可见的对象的值是对象的初始值,由T分配给对象的值,或者由对象分配给对象的值另一个线程,根据以下规则。
字符串文字与任何其他常量对象一样,不能合法地分配给;它有静态存储持续时间,因此在程序启动之前初始化;因此,所有线程都会始终看到它的初始值。
较旧的标准对线程无话可说;因此,如果您的编译器不支持C ++ 11线程模型,那么您将不得不查阅其文档以获取任何线程安全保证。但是,很难想象任何对不可变对象的访问都不是线程安全的实现。
答案 1 :(得分:3)
是的,这很安全。为什么不呢?如果您尝试修改字符串,那将是不安全的,但这无论如何都是非法的。
答案 2 :(得分:2)
从多个线程访问不可变数据总是安全的。字符串文字是不可变数据的一个示例(因为在运行时修改它们是非法的),因此从多个线程访问它们是安全的。
答案 3 :(得分:1)
只要您只读取数据,就可以根据需要从多个线程访问它。当需要更改数据时,就会变得复杂。
答案 4 :(得分:0)
这取决于C编译器的实现。但我不知道并发读访问可能不安全的实现,所以在实践中这是安全的。
答案 5 :(得分:0)
字符串文字(概念上)存储在只读内存中并在加载时(而不是在运行时)初始化。因此,可以随时从多个线程访问它们。
请注意,更复杂的结构可能无法在加载时初始化,因此多个线程访问可能会在创建对象后立即出现问题。
但字符串文字是完全安全的。