Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中线程同步的单锁对象或多锁对象_C#_Multithreading - Fatal编程技术网

C# C中线程同步的单锁对象或多锁对象

C# C中线程同步的单锁对象或多锁对象,c#,multithreading,C#,Multithreading,我有一个类,它有一些字典对象和其他需要保护的数据。这些由多个线程(读线程和写线程)操作。我不确定我应该使用单个锁对象来锁定所有数据还是每个数据应该有不同的锁?就我而言,缓慢的性能比死锁更好 static object object1 = new object(); static object object2 = new object(); private Queue<Change> changeNotifications = new Queue<Chan

我有一个类,它有一些字典对象和其他需要保护的数据。这些由多个线程(读线程和写线程)操作。我不确定我应该使用单个锁对象来锁定所有数据还是每个数据应该有不同的锁?就我而言,缓慢的性能比死锁更好

    static object object1 = new object();
    static object object2 = new object();
    private Queue<Change> changeNotifications = new Queue<Change>();
    private Dictionary<string, IConnectionClient> connectionClients1 = new Dictionary<string, IConnectionClient>(StringComparer.OrdinalIgnoreCase);
    private Dictionary<string, IConnectionClient> connectionClients2 = new Dictionary<string, IConnectionClient>(StringComparer.OrdinalIgnoreCase);

    public static void ThreadFunction1()
    {
        lock (object1)
        {
            //update connectionClients2
        }
    }

    public static void ThreadFunction2()
    {
        lock (object2)
        {
            //access changeNotifications
            //update connectionClients1
        }
    }

我的问题是,我可以使用带锁的单锁对象吗?

使用单锁是安全的,但可能很慢

如果您的资源是独立的,那么一定要为每个资源使用单独的锁


如果您需要获取多个锁,请确保始终以相同的顺序获取它们,以防止死锁的可能性。

是!虽然演出会受到影响,但这是很有可能的

然而,为了保持健壮和灵活,我将围绕所需对象创建一个线程安全的包装类,该类必须通过多线程(在本例中为字典)访问。这将把锁定封装在对象中,从而允许以更干净的方式处理线程安全,并从未来的开发中抽象出来

要做到这一点,一种方法可以是使用一个锁的想法!确保对象中的所有可变字段都用锁包装,并且应用程序将按需要工作。一种更受性能驱动的方法是利用每个变量的锁


虽然看似合理,但它确实提出了一个问题,即为什么首先要使用多线程。通过使用一个锁,这告诉我,要么你有几个字段受到保护,在这种情况下,一个锁是一种有效的方法,要么你对多线程完全有效感到不舒服,大多数人都是这样,要么你正试图锁定长时间的操作。锁定应最小化为短而小的操作,以防止不必要的线程等待、过度使用计算机资源,并且实际上将性能降低到比单线程方法更低的程度。

您能保证ThreadFunction1和ThreadFunction2不会同时被调用吗?@jdweng为什么他们需要这样的保证呢?不知道数据是如何使用的,以及如何允许从各个线程使用数据,这个问题无法回答。我们不知道同时使用不同的词典是否可以接受。这将取决于它们的实际用途和包含的内容。如果您能保证两个线程的方法永远不会同时被调用,那么问题就解决了。但是对于线程,我认为您不能保证这两个方法永远不会同时被调用。@jdweng当然,如果调用方已经在为您进行同步,您不需要再次同步代码。如果有人希望调用方总是为他们进行同步,那么他们似乎不太可能询问如何让类处理同步。