Блокировка и многопоточность в dotNet - PullRequest
0 голосов
/ 30 июня 2009

У меня есть несколько тем, которые все должны писать в один и тот же словарь. У меня есть блокировка объекта, которую я поддерживаю, чтобы убедиться, что только 1 поток обновляет словарь одновременно. Мой вопрос заключается в следующем. Если один поток пытается обновить словарь, в то время как другой имеет блокировку, будет ли поток просто ждать? Это просто потерпит неудачу? Если потоки просто ждут, могу ли я избежать ожидания слишком многих из них, есть ли способ сказать, что максимум пять тад могут стоять в очереди, остальные просто продолжают?

Ответы [ 3 ]

1 голос
/ 30 июня 2009

Если один поток удерживает блокировку, а второй поток пытается получить такую ​​же блокировку, второй поток будет ждать.

Потоки только пишут, или у вас также есть операции чтения? Если это так, вам, вероятно, следует использовать ReaderWriterLockSlim (если вы этого еще не сделали). Это позволит вам параллельно читать несколько потоков, если поток не обновляется, и в этом случае он может получить эксклюзивный доступ к ресурсу.

0 голосов
/ 30 июня 2009

Замки не защищают объекты как таковые. Блокировки защищают другие потоки от получения той же блокировки. Таким образом, если блокировка предназначена для защиты ресурса (например, словаря), то другие потоки должны взаимодействовать и получить такую ​​же блокировку, прежде чем получить доступ к ресурсу (словарю). Если поток игнорирует это и, тем не менее, получает доступ к ресурсу, он может столкнуться с недопустимым, переходным состоянием в словаре и в результате встретить все виды ошибок. Это относится как к операциям чтения, так и записи. Классы коллекций в .Net поставляются со свойством SyncRoot, которое, как правило, является рекомендуемым объектом для использования всеми потоками, если доступ к нескольким потокам запрещен. Кроме того, как уже указывал Фредрик, существуют специализированные типы ReaderWriter , которые допускают многократное совместное чтение и единственную эксклюзивную запись. Более сложные схемы, подобные той, на которую вы ссылаетесь (избегайте операций, если ресурс ожидает слишком много потоков), довольно трудно кодировать полностью безопасным и правильным способом, поэтому лучше избегать таких сложностей и придерживаться базовых примитивов.

0 голосов
/ 30 июня 2009

Оператор lock (obj) блокирует доступ любого другого потока к общему ресурсу до тех пор, пока этот поток не будет завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...