C ++ 0x和静态局部变量的性能损失?

时间:2011-05-15 16:05:26

标签: multithreading static c++11

由于在C ++ 0x 中所有其他线程都必须存在,因此实际性能损失是多少 在这样的情况下等待

string& program_name() {
  static string instance = "Parallel Pi";
  return instance;
}

让我们假设最佳方案:程序员非常小心,即使只有100个线程,主线程调用函数program_name,所有其他99 工作线程忙着做有用的东西,这不涉及调用这个“关键”功能。

我引用新的C ++ 0x-Std § 6.7.(4) stmt.decl

  

...这样的对象在第一次控制通过其声明时初始化...如果控件在初始化对象时同时进入声明,则并发执行应等待初始化完成...

需要一个真实的编译器来强加给我以确保按照标准的要求完成静态初始化,这是一个什么是实际的开销。

  • 是否需要锁/互斥锁?我认为它们很贵,即使不是真的需要它们?
  • 如果它们价格昂贵,是否可以通过较便宜的机制来完成?

编辑:已添加string ...

2 个答案:

答案 0 :(得分:2)

  

如果控件在初始化对象时同时进入声明,则   并发执行应等待初始化完成......

我认为在并发编程中这是合理且非常正常的事情。无论如何,这句话并没有说所有其他线程都必须等待这个初始化。他们必须等待以防他们需要访问初始化对象。

  

是否需要锁/互斥锁?我认为它们很贵,即使不是真的需要它们?

可能。实际上互斥锁/锁定 非常昂贵,只有当锁定的代码片段需要被许多甚至所有线程频繁访问时,它们才会很昂贵。

  

如果它们价格昂贵,是否可以通过较便宜的机制来完成?

还有另一种基于非锁定的解决方案AFAIK。

答案 1 :(得分:1)

如果你真的担心锁的价格,你可以在启动工作线程之前调用该函数,这会初始化静态。如果你在线程启动后调用它,你或者编译器必须安排某种锁定,所以没有真正的额外开销。