【问题标题】:std::locale/std::facet Critical sectionstd::locale/std::facet 关键部分
【发布时间】:2015-04-12 04:37:28
【问题描述】:

出于好奇。在过去,我看到像boost::to_lower 这样的函数性能下降,因为在分配惰性方面时std::use_facet 中使用了CriticalSection。据我所知,在语言环境中存在全局锁定错误,但根据 Stephan Lavavej 的说法,它已在 VS2013 中修复。瞧,我昨天看到这个锁在刻面杀死服务器性能上,所以我想我混淆了两个不同的问题。
但是首先,为什么在懒惰方面有一个CriticalSection?显然它会破坏性能。为什么他们没有解决某种可升级的锁或指针上的原子操作?

【问题讨论】:

  • 我也有同样的问题...
  • @Mehrdad,如果你真的想要答案,最好咨询 VC++ 团队或在 Microsoft Connect 上开票
  • 你能添加一个链接到 Stephan Lavavej 说它在 VS2013 中修复的地方吗?
  • 3年,去找吧……我去找链接
  • @Frank,几乎不可能找到这个问题,因为 Microsoft 取消了 Connect 以支持 Collaborate。最接近的点击是这里social.msdn.microsoft.com/Forums/vstudio/en-US/… 和这里blogs.msdn.microsoft.com/vcblog/2012/06/15/… 连接问题:492561

标签: c++ multithreading visual-c++ locale


【解决方案1】:

MSVC++ 的std::locale 是根据底层C 函数setlocale 实现的。这涉及全局状态,因此必须由锁保护。

不幸的是,更改数据结构的锁定语义是一项 ABI 重大更改,因此我们暂时无能为力。

【讨论】:

  • 嗯,你真的单步过代码吗?如果我简单地运行for (;;) { std::use_facet<std::numpunct<char> >(loc); } 并单步执行,我会看到在use_facet 内部获取并释放了一个锁,而与基于C 语言环境的东西根本没有任何明显的交互。所以,除非我遗漏了什么,否则我不确定这个答案是否是这个问题的正确答案......
  • @Mehrdad:如果你这样做,构面将被缓存,因此它不需要进入 setlocale。但不幸的是,相同的锁用于保护缓存方面的表本身:/
  • 是的,所以我想问题是……他们为什么要这样设计?只是他们忽略了一些事情,还是有更多的故事?
  • 不知道;我想你得问问 Dinkumware。我不认为这些东西在过去十年中被触及过:/
  • @BillyONEal,我猜你比我们更接近 Dinkum :)
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2011-06-04
  • 2019-02-14
  • 2012-03-10
  • 2013-10-19
  • 1970-01-01
  • 2015-10-29
相关资源
最近更新 更多