2013-09-22 37 views
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]); 
     } 
    } 
} 

我的问题是,我能做到这样?

我的意思是,我可以声明一个非静态变量作为指向静态元素列表元素的指针,假设所有共享特定元素的进程都能正确访问它?

回答

3

集合中的对象对于每个线程都是相同的,即使它在列表中的位置发生了更改,所以如果要使用它来仅更改该对象的属性,那就没问题。

考虑让那个锁定在Collection[0]并不意味着“锁定集合中的第一要素”,而是“对象上锁定当前在集合中的第一个位置。”

+0

完美。谢谢C.Evenhuis! –

相关问题