多线程 – 发布并发对象

我对人们用来发布信息和更改数据结构的技术很感兴趣,这些数据结构在多个线程上共享而不会丢失很多并发性.根据我的个人经验,我经常遇到单个编写器/多个读者,其中单个线程正在更新对象,但是多个线程正在从对象读取并需要被告知更改.

举一个简单的例子,考虑一个哈希表(让我们假设它是线程安全的,无论是通过粗粒度锁定,细粒度锁定还是低锁技术等).线程1负责从哈希表中添加和删除信息,但是唯一的编写者.当任何密钥被更改,某个密钥被更改或任何变体时,可能希望通知其他线程.他们希望订阅的内容并不是特别重要.

你会用什么技巧(我喜欢论文的建议)来确保线程能够及时获得正确的变更信息?

最佳答案 你实际上已经问过两个不同的问题

MultipleReader / SingleWriter排除

更新通知(通常称为观察者模式)

MultipleReader / SingleWriter Locks是一个CLASSIC问题,有大量的文献.真正的问题是许多经典解决方案涉及多个互斥锁和信号量,并且可能非常重量级,经常涉及每个简单写锁定6个读取修改写入(RMW)周期和第一个读取锁定6个RMW

这两个问题有很多解决方案,效率和实用性取决于读取的到达率,写入的到达率,写入的持续时间,读取的持续时间,是否可以批量更新,是否需要升级读锁定,降级写锁定(在你的情况下听起来没有)

对于哈希表的示例,您可以使用“O(n访问线程)的中等粒度锁定,并且只是将锁定任意地分配给哈希表的块(单独链接注意到你.使用开放寻址锁定不一定锁定探测插槽).或者您也可以使用hop-scotch哈希并发哈希表算法

就通知而言,一些典型的问题是:

每个读取线程都必须查看(并处理)每个通知吗?
观察者是静态的还是动态的?即通知“网络”是否可以是静态的(编译时定义)

点赞