【问题标题】:Static storage objects optimization on thread context线程上下文的静态存储对象优化
【发布时间】:2019-06-18 21:06:11
【问题描述】:

编译器能否在多线程程序上下文中优化静态存储对象?例如,我要求它知道声明为静态的变量在用于线程中调用的函数时是否会产生副作用。

bool flag = false; // static storage duration object

void f(){ //function called in a thread
  flag = false;
  // do some work...
  flag = true;
}

//a possible representation of the code above after optimization
void f(){
  flag = true;
  // do some work...
} // is this possible to happen?

我从here 阅读了一些答案,但没有找到任何可以帮助的信息。

【问题讨论】:

  • 即使标准会保证从静态存储持续时间对象中分配和读取将被视为副作用,它也必须影响线程安全。线程安全是完全不同的野兽。

标签: c++ multithreading c++11 storage-duration


【解决方案1】:

静态存储持续时间对线程安全没有影响。在您的示例中,只要重新排序不会破坏 f 中的任何内容,第二个代码块就是合法的。

您仍然需要对任何线程写入的所有共享对象进行同步。在这种情况下,您可以通过使用 std::atomic<bool> 来实现 flag 之类的

std::atomic<bool> flag = false;

线程安全的规则是,如果您在多个线程之间共享一个对象,并且其中至少有一个是写入器,那么您需要同步。如果你不这样做,那么你有一个未定义行为的数据竞争。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2013-11-19
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多