微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个可由 1 个线程访问的数组,它可以返回其他线程请求的数据

如何解决一个可由 1 个线程访问的数组,它可以返回其他线程请求的数据

我将数组存储在动态 unordered_map 中。 有一个写入线程(它使用通过 WebSocket、REST 等接收到的数据更新表)和 1 个读取线程。 (有时可能有 3 或 4 个阅读线程,但这种情况很少见)。 目前,我必须锁定所有 unordered_map 才能更新或读取数据,因此并行度非常有限。

我想到了另一个允许我不做任何锁定的实现:

有 1 个单独的“数据库”线程,它将是唯一能够访问数据的线程。 线程会有一个队列来接收来自其他线程的请求:更新、检索数组的值、统计接收到的消息数量等。

我的问题是我不知道如何实现它来恢复数据。 目前,数据总是被复制,以避免持有锁太久,所以我会继续返回副本。

我取消了回调函数的选择,因为“数据库”线程不应该被另一个线程阻塞。

写访问次数/读访问次数为1000/1。大约 400k 写入访问和 400 次读取/秒。 因此,必须锁定每个写入是一个真正的问题,因为来自其他线程的访问非常罕见。 我想知道您是否有任何想法来实现这一点。

如果您有任何问题,请不要犹豫。

解决方法

您需要序列化对地图的所有访问,包括读取和写入,因为内部数据结构可能在写入期间不稳定.这种锁定协议的“开销”很小,但不可避免。

一个简单的方法是创建一个包含 (private ...) 映射和一个私有互斥锁的对象。提供了读取和写入方法,用于访问映射数据,使用互斥锁来序列化这些数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。