静态const变量是否是线程安全的?

Nya*_*yan 10 c multithreading

我想知道静态常量变量是否是线程安全的?

示例代码段:

void foo(int n)
{
     static const char *a[] = {"foo","bar","egg","spam"};
     if( ... ) {
       ...
      }
}
Run Code Online (Sandbox Code Playgroud)

Fer*_*cio 16

任何永远不会被修改的变量,无论它是否显式声明为const,都具有固有的线程安全性.

const并不是编译器保证变量是不可变的.const是一个承诺,你做出一个变量都不会被修改的编译器.如果你回到那个承诺,编译器将生成一个错误指向你,但你总是可以通过抛弃constness来使编译器沉默.


Jen*_*edt 13

为了真正安全,你应该这样做

static char const*const a[]

这会抑制数据的修改以及要修改的表中的所有指针.

顺便说一句,我更喜欢const在typename之后写一下,以便乍一看它const适用的地方,即它的左边.


小智 6

在您的示例中,指针本身可以被视为线程安全.它将被初始化一次,以后不会被修改.

但是,指向的内存内容根本不是线程安全的.

  • -1 const foo*表示指针指向无法更改的foo,**表示指针本身无法更改. (4认同)
  • 指针*可以*修改.实际字符串中的字符不能. (2认同)
  • 那只是写作.多个线程可以同时读取任何给定的内存块而没有任何问题.在这种情况下,如果所有数据都是const(指针和内容),那么就没有线程安全问题 - 如果他确保它只被初始化一次. (2认同)