Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 4.0_Concurrency_Locking_Mutex - Fatal编程技术网

C# 只锁定列表中的一个元素。这条路对吗?

C# 只锁定列表中的一个元素。这条路对吗?,c#,c#-4.0,concurrency,locking,mutex,C#,C# 4.0,Concurrency,Locking,Mutex,我有很多线;他们中的一些人共享一个对象;其他线程共享另一个对象,而这些对象位于所有线程共享的列表(字典)中 换句话说,有一个对象列表,所有线程共享该列表,尽管每个线程只使用该列表中的一个对象 通过以下方式锁定主列表,我没有并发问题: public class MainClass { private static List_of_objects list_of_objects; private static object var = new object(); priv

我有很多线;他们中的一些人共享一个对象;其他线程共享另一个对象,而这些对象位于所有线程共享的列表(字典)中

换句话说,有一个对象列表,所有线程共享该列表,尽管每个线程只使用该列表中的一个对象

通过以下方式锁定主列表,我没有并发问题:

public class MainClass
{
    private static List_of_objects list_of_objects;

    private static object var = new object();

    private static bool list_is_being_used = false;

    public void Main()
    {
        lock (var)
        {
            while(list_is_being_used)
            {
                Monitor.Wait(var);
            }

            list_is_being_used = true;

            // ... Do some things with an object of the list ...

            list_is_being_used = false;

            Monitor.Pulse(var);
        }
    }
}
由于每个线程将只使用列表中的一个元素,因此我想单独锁定该元素,因此只锁定使用该元素的线程,而不锁定使用其他元素的其余线程

我认为这样的事情可以做到:

public class MainClass
{
    private static List_of_objects list_of_objects;

    private static object var_x[] = new object [CONSTANT];  // I declare a mutex-variable for each element on the shared list
    ...

    private static bool element_x_is_being_used[] = [false,false,false,...];

    private ElementClass element; // I declare an object as a pointer to the element this thread is going to use. <---

    public void Main()
    {
        element = list_of_objects[1];

        ...

        lock (object var_x[1]) // I just want to lock this element of the list, not the whole list
        {
            while(element_1_is_being_used)
            {
                Monitor.Wait(object var_x[1]);
            }

            element_1_is_being_used = true;

            // ... Do some things with element 1 of the list ...

            element.set_whatever... // I change some values of the element

            element_1_is_being_used = false;

            Monitor.Pulse(object var_x[1]);
        }
    }
}
public类MainClass
{
私有静态列表\u对象列表\u对象;
私有静态对象var_x[]=new object[CONSTANT];//我为共享列表中的每个元素声明一个互斥变量
...
私有静态布尔元素_x_正在使用[]=[假,假,假,…];

private ElementClass element;//我声明了一个对象作为指向该线程将要使用的元素的指针。集合中的对象对于每个线程都是相同的,即使它在列表中的位置发生了变化,因此如果您只想用它来更改该对象的属性,就可以了


请记住,锁定集合[0]
并不意味着“锁定集合中的第一个元素”,而是“锁定当前位于集合中第一个位置的对象”.

对于每个线程,集合中的对象都是相同的,即使它在列表中的位置发生了变化,因此如果您只想使用它来更改该对象的属性,也可以


请记住,锁定集合[0]并不意味着“锁定集合中的第一个元素”,而是“锁定当前位于集合中第一个位置的对象”。

完美。感谢C.Evenhuis!!完美。感谢C.Evenhuis!!