gpt4 book ai didi

c# - 使用 c# 和 TPL 数据流的并发计数器模式

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:44 25 4
gpt4 key购买 nike

给定以下代码,count++ 在 C# 中并发访问下的行为如何:

 int count = 0;int Count=0;  

ActionBlock<Tuple<CloudBlockBlob, CloudBlockBlob>> copyblock =
new ActionBlock<Tuple<CloudBlockBlob, CloudBlockBlob>>(async (tuple) =>
{
await tuple.Item2.StartCopyFromBlobAsync(tuple.Item1);
var progessDone = count++ / (double)Count;
progress(progessDone,tuple.Item2.Name);

},
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = ExecutionDataflowBlockOptions.Unbounded });

1) 是否有可能两个任务可以同时更新计数,例如先读后写,最后只加一?2)如果是这样,避免这种情况的最佳做法是什么?周围有锁吗?

最佳答案

是的,这完全有可能 - 至少在理论上 - 但不,你不需要锁。只需使用 Interlocked.Increment :

var progressDone = Interlocked.Increment(ref count) / (double) Count;

(可能,根据您的 CPU 架构和 JIT,增量最终可能无论如何都是原子的,但绝对不能保证。即使具有原子性,也有一个线程在没有内存障碍的情况下看不到另一个线程写入的值的可能性。Interlocked.Increment 解决了所有这些问题,并且专门为这种情况而设计。)

关于c# - 使用 c# 和 TPL 数据流的并发计数器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22942220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com