线程和字符串文字

Threads and string literals

本文关键字:文字 字符串 线程      更新时间:2023-10-16

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

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

同时调用函数和取消引用指针是否可行?

编辑:许多答案。会接受第一个能给我看超出标准部分的人。

根据标准:

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

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

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

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

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

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

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

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

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

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