繁体   English   中英

如何使C ++ map :: swap线程安全?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM