线程安全标准:列表 C

新手上路,请多包涵

我是多线程的新手,我试图简单地使一些 std:lists 线程安全。每当将项目添加或删除到列表中时,执行 mutex.lock() 和 mutex.unlock() 就足够了吗?同样,我只是想让它们线程安全。

谢谢

原文由 Dark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 551
1 个回答

为了安全起见,您必须保护对列表的所有访问。虽然从没有锁的列表中读取不会损坏列表,但如果在另一个线程正在读取列表时修改了列表,则任何一个线程都可能损坏(即崩溃或产生不正确的结果)。

您必须为您希望内容稳定的整个代码范围持有锁。如果另一个线程可以随时擦除或重新排序任何元素,那么这包括任何时候您对其内容有实时迭代器。如果对哪些线程可以操作哪些元素有限制,则可以放宽锁定要求,以保持活动的迭代器。

使用 std::lock_guard 可以帮助确保您正确管理锁。只需在将操作您的列表的任何作用域的开头创建它的一个实例,并且在作用域的末尾它会自动解锁,即使作用域通过异常退出也是如此。

原文由 nate 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题