线程和字符串文字

时间:2012-03-02 12:35:12

标签: c++ multithreading string-literals

使用多个线程同时访问字符串文字是否有效(已定义的行为)?给定这样的函数:

const char* give()
{
  return "Hello, World!";
}

是否可以保存以调用该函数并同时取消引用指针?

编辑:很多答案。接受第一个可以向我展示标准部分的人。

6 个答案:

答案 0 :(得分:4)

根据标准:

  

C ++ 11 1.10 / 3:特定点处线程T可见的对象的值是对象的初始值,由T分配给对象的值,或者由对象分配给对象的值另一个线程,根据以下规则。

字符串文字与任何其他常量对象一样,不能合法地分配给;它有静态存储持续时间,因此在程序启动之前初始化;因此,所有线程都会始终看到它的初始值。

较旧的标准对线程无话可说;因此,如果您的编译器不支持C ++ 11线程模型,那么您将不得不查阅其文档以获取任何线程安全保证。但是,很难想象任何对不可变对象的访问都不是线程安全的实现。

答案 1 :(得分:3)

是的,这很安全。为什么不呢?如果您尝试修改字符串,那将是不安全的,但这无论如何都是非法的。

答案 2 :(得分:2)

从多个线程访问不可变数据总是安全的。字符串文字是不可变数据的一个示例(因为在运行时修改它们是非法的),因此从多个线程访问它们是安全的。

答案 3 :(得分:1)

只要您只读取数据,就可以根据需要从多个线程访问它。当需要更改数据时,就会变得复杂。

答案 4 :(得分:0)

这取决于C编译器的实现。但我不知道并发读访问可能不安全的实现,所以在实践中这是安全的。

答案 5 :(得分:0)

字符串文字(概念上)存储在只读内存中并在加载时(而不是在运行时)初始化。因此,可以随时从多个线程访问它们。

请注意,更复杂的结构可能无法在加载时初始化,因此多个线程访问可能会在创建对象后立即出现问题。

但字符串文字是完全安全的。