[英]How to make a C++ map::swap thread safe?
我需要换出std :: map来更新一些配置。 这发生在一个线程中。
在另一个线程中,我需要从该映射中读入值(目前仅一个消费者线程)。
在生产者线程中,我目前有(伪代码):
pthread_mutex lock;
std::map<int, char> current_config;
std::map<int, char> new_config;
...
<Read into new config>
ScopeLock(lock);
current_config.swap(new_config);
在使用者线程中,我在产生器线程中调用一个访问器,该访问器执行以下操作:
ScopeLock(lock)
return current_config;
这似乎可以防止使用者在交换期间访问地图,但是我想知道,如果使用者使用地图,然后生产者需要交换地图,将会发生什么情况。
这个线程安全吗?
我想我可以在两个线程中都做一个锁,但是我试图避免要求使用者使用一个锁。
如果您的访问者通过引用返回,那么代码是不安全的,因为使用者获得了引用,因此释放了锁,但是您的生产者可能会进行另一次交换。
如果访问器按值返回,则您的代码可以安全,因为您设置了锁并返回了副本,然后删除了锁。
我之所以说“可以”是因为您的保护还不够:我想您的生产者不仅在交换地图,而且还在初始化,填充地图和更新地图。 因此,您需要为以任何方式修改地图的每个生产者功能设置锁定。 否则,您的消费者可以阅读地图,认为它很安全,而其他代码则可以更改现有位置。
此外,使用副本意味着您的使用者可以使用过时的数据,从而使处理不那么可能是并行的。
一种替代方法是,生产者和消费者使用共享的地图,该地图嵌入到一个对象中,该对象旨在嵌入一个线程,供生产者和消费者安全访问该地图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.