线程和字符串文字
Threads and string literals
使用多个线程同时访问字符串文字是否有效(定义的行为)?给定这样的函数:
const char* give()
{
return "Hello, World!";
}
同时调用函数和取消引用指针是否可行?
编辑:许多答案。会接受第一个能给我看超出标准部分的人。
根据标准:
C++11 1.10/3:根据以下规则,线程T在特定点上可见的对象的值是该对象的初始值、由T分配给该对象的值或由另一个线程分配给对象的值。
字符串文字和任何其他常量对象一样,不能合法地分配给;它具有静态存储持续时间,因此在程序启动之前进行初始化;因此,所有线程都将始终看到它的初始值。
旧的标准对线程没有什么可说的;因此,如果您的编译器不支持C++11线程模型,那么您将不得不查阅其文档以获得任何线程安全保证。然而,很难想象在任何实现中,对不可变对象的访问都是线程安全的。
从多个线程访问不可变数据总是安全的。字符串文字是不可变数据的一个例子(因为在运行时修改它们是非法的),所以从多个线程访问它们是安全的。
只要只读取数据,就可以从任意多个线程访问数据。当数据需要更改时,它就会变得复杂。
这取决于C编译器的实现。但我不知道有哪个实现中并发读取访问可能是不安全的,所以在实践中这是安全的。
字符串文字(概念上)存储在只读内存中,并在加载时初始化(而不是在运行时)。因此,在任何时候从多个线程访问它们都是安全的。
请注意,更复杂的结构可能不会在加载时初始化,因此多线程访问可能会在创建对象后立即出现问题。
但是字符串文字是完全安全的。
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 如何在 C 宏中将变量字符串与文字字符串连接起来?
- 我如何知道 boost::any 是否包含文字字符串
- C 专用模板功能接收文字字符串
- 如何使变量成为文字字符串
- 可以一个#define一个文字字符串,其中包含用于资源文件的非ANSI字符的字符串
- 从文字字符串生成编译时常量整数
- 当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?
- 如何在 C 或C++宏中使用函数作为文字字符串
- GCC中可能的错误:结构中的文字字符串类型
- 文字字符串有效,但字符串在 file.open() 中不起作用
- C/C++:文字字符串中"xNNN"格式的固有歧义
- constexpr函数中声明为静态的文字字符串