以下是线程安全的,因为每个数组元素只能由一个线程访问(包括此处未显示的真实世界部分):
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
}
这个函数是否也是线程安全的(特别是考虑到在第一次调用函数时发生的数组初始化,而不是在启动时)?
答案 0 :(得分:3)
安全。具有静态存储持续时间的所有对象在程序启动之前初始化。这意味着即使在任何线程发挥作用之前。
定义了两个执行环境:独立和托管。在 两种情况下,程序启动发生在指定的C函数时 由执行环境调用。 具有静态存储的所有对象 持续时间应在之前初始化(设置为初始值) 程序启动。这种初始化的方式和时间是 否则未指明。程序终止将控制权返回给 执行环境。
(强调我的)。
C99没有线程的概念。但这就是我如何从标准中解释上述引用。