Да, для блокировки вам нужен общий ресурс. Вот как работает синхронизация шаблонов блокировки / мьютекста .
Вы правильно выполнили первую часть, имея выделенный объект мьютекса (m_lock), чтобы указать Monitor на.
Youкажется, есть странная, необъяснимая проблема с использованием оператора блокировки. Вы, кажется, намереваетесь вызвать Monitor.Enter () и .Exit (). Это не имеет абсолютно никакого смысла, делает код более многословным и более склонным к ошибкам. Пожалуйста, просто прекратите это делать.
function or property{
lock(mutex){
//do your Work here
}
}
Это минимальная сумма, которую вы можете сделать для синхронизации.
Это также максимум, который вы можете сделать из этого класса.
Существуют условия гонки, которые ни один код класса не может предотвратить. Только код вызова может их предотвратить.
Это вероятно , почему у нас нет одновременный список - Индекс Race условия. Индекс становится недействительным, потому что кто-то добавил или удалил что-то из него после получения этого индекса.
- Предотвращение условий гонки Add () и Remove ()? Не проблема. Используйте приведенный выше пример кода.
- Предотвращение условий гонки по индексу? Нет шансов. Код класса имеет шанс снежного кома во время большого взрыва, чтобы предотвратить это конкретное состояние гонки.
Сумка, Очередь или Стек? Не иметь индекс для использования, только добавить / удалить или эквиваленты. Не проблема. Словарь? Использует ключ. Здесь нет опасности расы. И да, вы можете полностью использовать ConcurrentDictionary<int, T>
вместо List.
Array, List или что-то еще с индексом? Только телефонный код может предотвратить этот пожар.