相关疑难解决方法(0)

函数静态变量是否在GCC中是线程安全的?

在示例代码中

void foo()
{
  static Bar b;
  ...
}
Run Code Online (Sandbox Code Playgroud)

使用GCC编译是否可以保证b以线程安全的方式创建和初始化?

在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:

不要发出额外的代码来使用C++ ABI中指定的例程来进行本地静态的线程安全初始化.您可以使用此选项在不需要线程安全的代码中略微减小代码大小.

  1. 这是否意味着,默认情况下,GCC的本地静态是线程安全的?所以没有理由明确保护,例如pthread_mutex_lock/unlock

  2. 如何编写可移植代码 - 如何检查编译器是否会添加其防护?或者关闭GCC的这个功能是否更好?

c++ static gcc initialization thread-safety

58
推荐指数
4
解决办法
3万
查看次数

C++多线程:是本地静态lambda线程安全的初始化吗?

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)

c++ lambda multithreading c++11

16
推荐指数
2
解决办法
2212
查看次数