具有c#和TPL数据流的并发计数器的模式

时间:2014-04-08 15:58:56

标签: c#

鉴于以下代码,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)如果是这样,最好的做法是避免这种情况?锁定它?

1 个答案:

答案 0 :(得分:4)

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

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

(它的可能,取决于你的CPU架构和JIT,增量可能最终都是原子的,但它肯定是即使有原子性,也有可能一个线程没有看到没有内存障碍的另一个线程所写的值。Interlocked.Increment修复了所有这些,并且是为这种情况精确设计的。)< / p>