0
我有一些线程;其中一些共享一个对象;其他人共享另一个,而这些对象在所有线程共享的列表(字典)中。仅锁定列表中的一个元素。这是正确的方式吗?
换句话说,有一个对象列表,它被所有的线程共享,虽然他们每个都只使用这个列表中的一个对象。
我并没有通过这种方式锁定主力名单并发问题:
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]);
}
}
}
我的问题是,我能做到这样?
我的意思是,我可以声明一个非静态变量作为指向静态元素列表元素的指针,假设所有共享特定元素的进程都能正确访问它?
完美。谢谢C.Evenhuis! –