多线程中的日志冲突

时间:2019-05-08 10:26:09

标签: c# .net multithreading locking

我想用这个简单的代码记录多线程中的冲突

DiGraph

这是一种适合在“碰撞”列表中添加元素的方法

    public T DataRef
    {
        get
        {
            Collisions.DetectAndSaveCollision(typeof(T).ToString(), Sync);
            lock (Sync)
            {
                return _tData;
            }
        }
        set
        {
            IsInitialized = true;
            Collisions.DetectAndSaveCollision(typeof(T).ToString(), Sync);
            lock (Sync)
            {
                _tData = value;
            }
        }
    }

但是我不确定它没有死锁

1 个答案:

答案 0 :(得分:1)

这是无死锁的,因为最多可以同时进行一次锁。

正如Lasse在评论中指出的,这里存在竞争条件,因为您连续两次获得了6.4.7锁。因此数据将不准确。如果近似数据足以满足您的需求,那么就可以了。

您可以通过不立即获得锁定来解决比赛。像这样:

Sync

这当然需要用var acquiredImmediately = Monitor.TryEnter(...); //test lock if (!acquiredImmediately) { Log(...); Monitor.Enter(...); //retry by blocking } CriticalRegion(); Monitor.Exit(); 保护。