我有一个数组,许多线程都在写入。但是每个线程都有一个预分配的索引范围可以写入。此外,在所有线程完成之前,没有任何内容将从该数组中读取。
到目前为止,非常安全。当我需要扩展数组时,问题就出现了,当然,我指的是将其交换为一个复制第一个的更大的数组。这只偶尔发生(类似于 ArrayList)。
目前,我对数组的每个单独写入都进行锁定。即使不需要锁定以保持数组一致,我也必须锁定,以防数组当前正在被复制/交换。
由于有很多写操作,我不想要求它们进行锁定。只要在复制和交换数组时只要求编写器线程进行锁定的解决方案是可以接受的,因为这是不频繁的。
但我不能仅在复制/交换进行时施加写入锁定,因为线程可能已经将写入提交给旧数组。
我认为我需要某种障碍,等待所有写入完成,然后暂停线程,同时我复制/交换数组。但是CyclicBarrier需要我准确地知道目前有多少个活动线程,这是棘手的,并且可能容易受到边缘情况的影响,其中障碍最终会永远等待,或者太早降低。特别是我不确定如何处理在障碍已经存在的情况下新线程的到来,或者如何处理当前正在轮询作业队列的线程,因此,在没有新作业的情况下,将永远不会减少障碍计数。
我可能必须实现某些(原子)计算活动线程并尝试预先处理所有边缘情况的东西。
但这可能是一个我不知道的“已解决”的问题,因此我希望有比循环栅栏/线程计数更简单(因此更好)的解决方案。理想情况下,可以使用现有的实用程序类。
顺便说一下,我考虑过 CopyOnWriteArray。这对我没用,因为它为每个写入(很多)都进行复制,而不仅仅是数组扩展。
还要注意的是,结构写入基本上必须是一个数组或基于数组的。
谢谢
到目前为止,非常安全。当我需要扩展数组时,问题就出现了,当然,我指的是将其交换为一个复制第一个的更大的数组。这只偶尔发生(类似于 ArrayList)。
目前,我对数组的每个单独写入都进行锁定。即使不需要锁定以保持数组一致,我也必须锁定,以防数组当前正在被复制/交换。
由于有很多写操作,我不想要求它们进行锁定。只要在复制和交换数组时只要求编写器线程进行锁定的解决方案是可以接受的,因为这是不频繁的。
但我不能仅在复制/交换进行时施加写入锁定,因为线程可能已经将写入提交给旧数组。
我认为我需要某种障碍,等待所有写入完成,然后暂停线程,同时我复制/交换数组。但是CyclicBarrier需要我准确地知道目前有多少个活动线程,这是棘手的,并且可能容易受到边缘情况的影响,其中障碍最终会永远等待,或者太早降低。特别是我不确定如何处理在障碍已经存在的情况下新线程的到来,或者如何处理当前正在轮询作业队列的线程,因此,在没有新作业的情况下,将永远不会减少障碍计数。
我可能必须实现某些(原子)计算活动线程并尝试预先处理所有边缘情况的东西。
但这可能是一个我不知道的“已解决”的问题,因此我希望有比循环栅栏/线程计数更简单(因此更好)的解决方案。理想情况下,可以使用现有的实用程序类。
顺便说一下,我考虑过 CopyOnWriteArray。这对我没用,因为它为每个写入(很多)都进行复制,而不仅仅是数组扩展。
还要注意的是,结构写入基本上必须是一个数组或基于数组的。
谢谢