Sta*_*ked 6 c++ multithreading stl visual-studio
我正在尝试构建一个可以扩展到多个核心的俄罗斯方块人工智能算法。
在我的测试中,结果表明使用多个线程比使用单个线程慢。
经过一些研究,我发现我的线程大部分时间都在等待_Lockit _Lock(_LOCK_DEBUG)。这是一个屏幕截图。
正如您所看到的,锁应用于局部变量,无论如何它都不需要任何锁定!
我的问题是:
我通过在 Visual Studio 项目中设置这些命令行选项来消除锁定:
/D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0"
Run Code Online (Sandbox Code Playgroud)
将其应用于解决方案文件中的所有项目非常重要,否则在运行时会发生错误(迭代器冲突等)。
我改变的第二件事是改变std::vector<bool>成std::vector<char>。我不知道std::vector<bool>这么慢。
如果您将时间花在 LOCK_DEBUG 上,那么您正在使用调试迭代器。这些迭代器都会跟踪它们的位置和父容器,并为您检测几种未定义行为的情况。然而,它们确实会带来运行时成本。
在发布模式下编译,看看这是否仍然是瓶颈。可能还需要一个额外的开关或#define需要将它们关闭——这不是积极的。
任何其他锁定实际上都是正确操作所必需的——当您从向量中读取数据时,必须确保没有人同时写入该向量(至少要获得大多数 STL 所期望的线程安全性)实现——即不同的读者是安全的,即使多个作者不安全)。这需要锁定来维护。
还要考虑不使用vector<bool>(使用 adeque<bool>或 avector<char>或vector<int>代替),因为它通常需要更多的线程开销,因为它将伪布尔值存储在各个位中。这让它可以在更小的空间中容纳更多的内容,但不幸的是,这意味着对容器的读取和写入不再是原子的,这可能需要更多的锁定。
| 归档时间: |
|
| 查看次数: |
2624 次 |
| 最近记录: |