我是多线程的新手,我试图简单地使一些 std:lists 线程安全。每当将项目添加或删除到列表中时,执行 mutex.lock() 和 mutex.unlock() 就足够了吗?同样,我只是想让它们线程安全。
谢谢
原文由 Dark 发布,翻译遵循 CC BY-SA 4.0 许可协议
我是多线程的新手,我试图简单地使一些 std:lists 线程安全。每当将项目添加或删除到列表中时,执行 mutex.lock() 和 mutex.unlock() 就足够了吗?同样,我只是想让它们线程安全。
谢谢
原文由 Dark 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
为了安全起见,您必须保护对列表的所有访问。虽然从没有锁的列表中读取不会损坏列表,但如果在另一个线程正在读取列表时修改了列表,则任何一个线程都可能损坏(即崩溃或产生不正确的结果)。
您必须为您希望内容稳定的整个代码范围持有锁。如果另一个线程可以随时擦除或重新排序任何元素,那么这包括任何时候您对其内容有实时迭代器。如果对哪些线程可以操作哪些元素有限制,则可以放宽锁定要求,以保持活动的迭代器。
使用 std::lock_guard 可以帮助确保您正确管理锁。只需在将操作您的列表的任何作用域的开头创建它的一个实例,并且在作用域的末尾它会自动解锁,即使作用域通过异常退出也是如此。