C # Добавить экземпляр класса с внутренним таймером в статический список, это безопасно? - PullRequest
1 голос
/ 31 мая 2010

Моя программа имеет статический список типа classA. ClassA реализует потоковый таймер, который выполняет задачу. Список может содержать столько экземпляров classA, сколько необходимо. Вызывает ли этот метод проблемы с многопоточностью, когда экземпляры классов могут блокировать друг друга? Это тот случай, когда я могу решить эту проблему. например:

static List<MyClassType> list=null;
void static Main()
{
   list = new List<MyClassType>();
   var a = new MyClassType();
   var b = new MyClassType();
   list.Add(a);
   list.Add(b);
   Console.ReadKey();
}

a и b выполнят свою внутреннюю задачу в зависимости от времени. Это метод bsd? Почему?

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

Это действительно зависит от того, что делают задачи таймера. То, что есть ссылки на различные объекты из одного и того же списка, не влияет на планирование их потоков и т. Д.

Было бы небезопасно , если бы действие таймера начало изменять список - List<T> не является поточно-ориентированным, за исключением нескольких читателей. Если одной из частей задачи таймера необходимо удалить экземпляр из списка (например), вам потребуется блокировка, чтобы это работало должным образом - и вам также нужно быть осторожным при переборе списка и т. Д.

0 голосов
/ 31 мая 2010

Код не является потокобезопасным, если это то, что вы имеете в виду.

Если методы, такие как add и remove, вызываются из потоков и вызываются одновременно, это приведет к разрушению вашего списка.

Вы можете решить эту проблему, используя lock(list){ list.add(); list.remove(); } каждый раз, когда используете список.

Но это грязно, потому что вы можете забыть ... Гораздо лучшее решение - переопределить класс List и сделать его собственную безопасную реализацию:

public class ThreadSafeList<T> : List<T>
{
    private List<T> list;
    // Use any normal List constructor here.
    public ThreadSafeList(List<T> list)
    {
        this.list = list;
    }

    public bool Add(T item)
    {
        lock (list)
        {
            return this.Add(item);
        }
    }
}

И, конечно, также реализовать оставшиеся методы, использовать блокировку для тех, которые могут изменить что-либо в списке.

...