2015-06-15 2 views
0

Я использую lock для добавления элементов в list параллельно для foreach, как показано ниже.Что представляет собой объект для блокировки

 Parallel.ForEach(list, i => 
      { 
       //... 

       lock (LockThread) 
       { 
        _asset.Add(...); 
       } 
      }); 

LockThread является static readonly object.

Что я понимаю, так это то, что lock делает блок одним потоком и не допускает многозадачность.

Итак, почему я должен дать ему объект? Что оно делает?

Почему я не могу просто написать

lock {...} 
+1

В качестве дополнительной заметки вы можете переосмыслить свою коллекцию ''assass и' lock' и, возможно, использовать 'ConcurrentBag' в сочетании с' Parallel.ForEach() '. «блокировка» чего-то является довольно дорогостоящей операцией и ограничивает масштабируемость. Проверьте библиотеку _ [Библиотека параллелизма задач (TPL)] (https://msdn.microsoft.com/en-us/library/dd460717 (v = vs.110) .aspx) _ – MickyD

ответ

2

Для данного object кода в самое большее один lock заявление, которое использует этот объект может выполнять в момент времени.

Если у вас есть

var obj1 = new object(); 
var obj2 = new object(); 

и затем

lock (obj1) { 
    // code block 1a 
} 

lock (obj1) { 
    // code block 1b 
} 

lock (obj2) { 
    // code block 2 
} 

затем блок кода 1a и блок кода 2 может выполняться одновременно, как код может блокировать 1b и 2. Код блоков 1a и 1b не будет быть в состоянии выполнить одновременно. И, конечно, только один поток за раз может выполнять блок кода 1a, а также для других.

+0

так это все? я не имею в виду больше ничего использовать? его важно, конечно, но я хочу знать –

+0

Есть много тонкостей, чтобы исследовать правильный способ использования 'lock', но в основном это утверждение. – mrmcgreg

+0

спасибо за ответ. простой с хорошим примером :) –

0

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

Например, вы можете найти разницу между Collection и ConcurrentCollection

0

при применении lock вы в основном говорите, «Теперь о n только 1 может использовать эту область действия «блокировка произошла на block of memory, которая помечена как blocked, поэтому мы используем самую основную форму, которая содержит память, которая является классом object.

lock (refrenceMemoryObject) { 
    // Scope 
} 

Вы можете прочитать больше о замке HERE

Смежные вопросы