Array.Resize(.)是否线程安全

本文关键字:线程 安全 是否 Resize Array | 更新日期: 2023-09-27 18:01:03

是否正在调用Array.调整用作SAEA线程安全缓冲区的数组的大小?不同的线程都会写入数组中自己分配的部分,我只想在连接用户增加时初始化的大小用完后,使数组变得更大而不锁定。

byte[] buffer; //Accessed
object expand_Lock = new object();
public void AsyncAccept()
{
    //Lock here so we don't resize the buffer twice at once
    lock(expand_Lock)
    {
        if (bufferFull)
        {
            Array.Resize(buffer, buffer.Length + 2048 * 100); //Add space for 100 more args
            //Is Array.Resize threadsafe if buffer can be read/wrote to at anytime?
            AssignMoreSAEA(2048, 100); //irrelevant to question what this does
        }
    }
}

Array.Resize(.)是否线程安全

否,Array.Resize不是线程安全的。正在调整大小的数组可能必须在内存中移动,并且调整大小后的数组甚至与传入的数组不相同。

这意味着当Array.Resize创建新数组并复制项时,一个线程可能正在向原始数组中写入内容——复制操作不受保护。这可能会导致数据丢失。

  • 该方法不会更改原始数组
  • 该方法不会在多线程场景中引发在单线程场景中不会引发的异常,因为源数组具有固定的大小,并且元素没有被取消引用
  • 如果新长度等于旧长度,则该方法是线程安全的,因为根据文档,该方法在这种情况下什么都不做
  • 如果在操作过程中修改了源数组,则未指定调整大小的数组的内容。如果数组的元素适合一个机器字(IntPtr.Size或更小,包括引用类型(,则生成的数组的元素将分别包含调用该方法时源数组中同一元素的值,或在执行调整大小操作期间分配给该元素的任何值。如果元素不适合机器字,那么在执行调整大小操作期间修改的任何元素都将导致调整大小的数组中相应元素的未指定值