在示例代码中
void foo()
{
static Bar b;
...
}
Run Code Online (Sandbox Code Playgroud)
使用GCC编译是否可以保证b以线程安全的方式创建和初始化?
在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:
不要发出额外的代码来使用C++ ABI中指定的例程来进行本地静态的线程安全初始化.您可以使用此选项在不需要线程安全的代码中略微减小代码大小.
这是否意味着,默认情况下,GCC的本地静态是线程安全的?所以没有理由明确保护,例如pthread_mutex_lock/unlock?
如何编写可移植代码 - 如何检查编译器是否会添加其防护?或者关闭GCC的这个功能是否更好?
C++ 11标准说明了本地静态变量初始化它应该是线程安全的(http://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables).我的问题是关于将lambda初始化为静态局部变量时究竟发生了什么?
我们考虑以下代码:
#include <iostream>
#include <functional>
int doSomeWork(int input)
{
static auto computeSum = [](int number)
{
return 5 + number;
};
return computeSum(input);
}
int main(int argc, char *argv[])
{
int result = 0;
#pragma omp parallel
{
int localResult = 0;
#pragma omp for
for(size_t i=0;i<5000;i++)
{
localResult += doSomeWork(i);
}
#pragma omp critical
{
result += localResult;
}
}
std::cout << "Result is: " << result << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用ThreadSanitizer使用GCC 5.4编译:
gcc …Run Code Online (Sandbox Code Playgroud)