C99中本地静态数组的线程安全性

时间:2017-01-25 15:32:22

标签: c arrays thread-safety c99 static-variables

以下是线程安全的,因为每个数组元素只能由一个线程访问(包括此处未显示的真实世界部分):

static bool myArray[THREAD_COUNT] = {false}; // Only used in DoSomething()

void DoSomething(uint8_t threadIndex)
{
   myArray[threadIndex] = true;
   // Real world function is more complex
}

现在考虑以下代码:

void DoSomething(uint8_t threadIndex)
{
   static bool myArray[THREAD_COUNT] = {false};
   myArray[threadIndex] = true;
   // Real world function is more complex
}

这个函数是否也是线程安全的(特别是考虑到在第一次调用函数时发生的数组初始化,而不是在启动时)?

1 个答案:

答案 0 :(得分:3)

安全。具有静态存储持续时间的所有对象在程序启动之前初始化。这意味着即使在任何线程发挥作用之前。

5.1.2 Execution environments

  

定义了两个执行环境:独立和托管。在   两种情况下,程序启动发生在指定的C函数时   由执行环境调用。 具有静态存储的所有对象   持续时间应在之前初始化(设置为初始值)   程序启动。这种初始化的方式和时间是   否则未指明。程序终止将控制权返回给   执行环境。

(强调我的)。

C99没有线程的概念。但这就是我如何从标准中解释上述引用。