【发布时间】:2017-01-25 15:32:21
【问题描述】:
以下是线程安全的,因为每个数组元素只能由一个线程访问(包括此处未显示的真实世界部分):
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
}
这个函数也是线程安全的吗(特别是考虑到在函数第一次调用时发生的数组初始化,而不是在启动时)?
【问题讨论】:
-
全局变量或局部
static变量基本相同。您所做的所有更改实际上只是范围(实际上)。并且本地static变量的初始化是线程安全的。 -
我们确定static局部变量的初始化是在第一次调用子程序时进行的吗?我不是 - 有人可以确认吗?
-
@linuxfan 我认为没有标准要求,因为它不会影响语义。但常见的实现是在编译期间将具有静态存储的初始化变量放入二进制文件的专用
.data部分。实际上,强制编译器将 one time 初始化代码包含到函数中是没有意义的。这样的代码将需要一些额外的跟踪(一些其他静态变量?)。更新:嘿,看,有标准要求... -
“考虑到在第一次调用函数时发生的数组初始化,而不是在启动时” - 这是错误的。静态对象的初始化在调用
main之前完成。赋值不是初始化。 -
我不会赌这个。为了安全起见,请使用 C11
_Thread_local。作为个人说明:我宁愿将数组放在函数体之外,并正确记录。
标签: c arrays thread-safety c99 static-variables