我有一个数组,许多线程都在向该数组写入数据.但是,每个线程都有一个可以写入的预先分配的索引范围.此外,在完成所有线程之前,不会从数组中读取任何内容.
到目前为止,线程是安全的.当我需要扩展数组时,问题就出现了,当然,我的意思是将它换成复制第一个的更大的array.这只是偶尔做的(类似于ArrayList).
目前,我正在为数组的每一次写入获取一个锁.即使不需要为保持数组一致性而锁定,我也必须锁定,以防数组当前正在被复制/交换.
因为有很多写操作,所以我不想为它们加锁.我同意这样一种解决方案,即只有在复制和交换数组时才需要锁定写线程,因为这种情况很少发生.
但是,我不能仅在复制/交换正在进行时才施加写锁定,因为线程可能已经在向旧数组提交写操作.
我认为我需要某种屏障来等待所有写入完成,然后在我复制/交换数组时暂停线程.但CyclicBarrier将要求我准确地知道当前有多少线程处于活动状态,这不是微不足道的,而且可能容易受到边界条件的影响,在这种情况下,边界最终将永远等待,或者过早地降低自身.特别是,我不确定如何在屏障已经设置好的情况下处理进入的新线程,也不确定如何处理当前正在轮询作业(job)队列的线程,因此在没有新作业(job)的情况下永远不会减少屏障计数.
我可能必须实现一些(原子地)计算活动线程数并试图抢占所有边缘情况的东西.
但这可能是一个我不知道的"已解决"问题,所以我希望有一个比循环屏障/线程计数更简单(因此更好)的解决方案.理想情况下,它使用现有的实用程序类.
顺便说一句,我已经考虑过CopyOnWritearray.这对我没有用处,因为它为每次写入(大量写入)复制,而不仅仅是数组扩展.
还要注意,写入的 struct 几乎必须是数组,或基于array.
谢谢