Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以互锁。交换两字节[]数组吗?_C#_Arrays_Interlocked - Fatal编程技术网

C# 可以互锁。交换两字节[]数组吗?

C# 可以互锁。交换两字节[]数组吗?,c#,arrays,interlocked,C#,Arrays,Interlocked,我想以原子方式交换两字节数组,而不需要 锁。i、 我不想这样做 byte[] src; byte[] dest; lock(synchLock) { dest = src; } 这是否可能与联锁交换?我发现它适用于文档中的int数组 谢谢 交换数组引用还是交换它们的元素?引用-是,元素-否。没有可用于数组的原子命令。是,互锁。Exchange支持所有引用类型和一些选定的值类型(Int32/64/Ptr,Single,Double)。不清楚

我想以原子方式交换两字节数组,而不需要 锁。i、 我不想这样做

    byte[] src;
    byte[] dest;
    lock(synchLock)
    {

       dest = src;
    }
这是否可能与联锁交换?我发现它适用于文档中的int数组


谢谢

交换数组引用还是交换它们的元素?引用-是,元素-否。没有可用于数组的原子命令。

是,
互锁。Exchange
支持所有引用类型和一些选定的值类型(Int32/64/Ptr,Single,Double)。

不清楚您在问什么,但
互锁交换在原子上执行以下操作:

  • 读取变量的预先存在的值
  • 写入变量
  • 请注意,操作中只涉及一个变量以及两个临时变量(正在写入的值和返回的前一个值)。而“交换”通常意味着写两个变量,这样每个变量都有一个先前存在于另一个变量中的值。这将是:

    byte[] src;
    byte[] dest;
    lock(synchLock)
    {
       var temp = dest;
       dest = src;
       src = temp;
    }
    

    InterlockedExchange
    不能用于实现对两个变量都具有原子效应的无锁交换。

    是的,只需交换引用即可。谢谢,Seva。你也不需要联锁,CLR承诺引用更新是原子的。然而,这并不能保证线程安全。