如何锁定由属于 2 个不同 类 的 2 个线程修改的数据结构
How to lock a data structure modified by 2 threads which belong to 2 different classes
基本上,我有一个 std::map 由 2 个 class 共享。
class A 的线程 1 持续监视此映射以获取某些信息并采取相应的措施,并且
class B 的线程 2 在某些套接字上接收到某些数据后更新此映射。
现在我怎样才能防止这个地图损坏,因为它被 2 个不同 classes 的 2 个线程修改?
一种方法是我可以为地图中的每个条目保留一个额外的 bool 变量,并在修改地图之前将其设置为 True,在修改之后将其设置为 False。
如果另一个线程 (Thread2) 发现这个 bool 变量已经为 True,那么它知道 Thread1 正在修改它,应该等待。
但是这种方法有效率吗?
你应该用 std::mutex
保护地图。用 bool 保护它,然后考虑当 bool 指示 "taken" 时要做什么,等等 - 仅意味着您正在尝试重新实现互斥锁。您可能无法比库版本更有效地做到这一点。
此外,在其中一个线程需要等待映射中的更改继续进行的任何情况下,使用(一个或多个)std::condition_variable
s。
基本上,我有一个 std::map 由 2 个 class 共享。 class A 的线程 1 持续监视此映射以获取某些信息并采取相应的措施,并且 class B 的线程 2 在某些套接字上接收到某些数据后更新此映射。
现在我怎样才能防止这个地图损坏,因为它被 2 个不同 classes 的 2 个线程修改?
一种方法是我可以为地图中的每个条目保留一个额外的 bool 变量,并在修改地图之前将其设置为 True,在修改之后将其设置为 False。 如果另一个线程 (Thread2) 发现这个 bool 变量已经为 True,那么它知道 Thread1 正在修改它,应该等待。 但是这种方法有效率吗?
你应该用 std::mutex
保护地图。用 bool 保护它,然后考虑当 bool 指示 "taken" 时要做什么,等等 - 仅意味着您正在尝试重新实现互斥锁。您可能无法比库版本更有效地做到这一点。
此外,在其中一个线程需要等待映射中的更改继续进行的任何情况下,使用(一个或多个)std::condition_variable
s。