鉴于以下代码,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)如果是这样,最好的做法是避免这种情况?锁定它?
答案 0 :(得分:4)
是的,完全可能 - 至少在理论上 - 但不是,你不需要锁定。只需使用Interlocked.Increment
:
var progressDone = Interlocked.Increment(ref count) / (double) Count;
(它的可能,取决于你的CPU架构和JIT,增量可能最终都是原子的,但它肯定是即使有原子性,也有可能一个线程没有看到没有内存障碍的另一个线程所写的值。Interlocked.Increment
修复了所有这些,并且是为这种情况精确设计的。)< / p>