Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
01.10.2014, 19:20
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
Например, в одном потоке я делаю перечисление по объекту с типом IEnumerable, а в другом блокирую (lock) этот объект. Тогда итератор в первом потоке "замрёт" на последней итерации? Или что произойдёт? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 19:28
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42Например, в одном потоке я делаю перечисление по объекту с типом IEnumerable, а в другом блокирую (lock) этот объект. Тогда итератор в первом потоке "замрёт" на последней итерации? Или что произойдёт? Если ты не делаешь лок в перечислении, то ничего не произойдет ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 19:31
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42Тогда итератор в первом потоке "замрёт" на последней итерации?Нет НемоКэп42Или что произойдёт?Простыми словами lock блокирует участок кода. И если поток доходит до этого участка, а он в это время выполняется другим потоком, то первый подождёт последнего. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 19:44
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
skyANAНемоКэп42Или что произойдёт?Простыми словами lock блокирует участок кода. И если поток доходит до этого участка, а он в это время выполняется другим потоком, то первый подождёт последнего. Т. е. тот поток, который заблокировал объект IEnumerable, будет ждать тот поток, который его не блокировал? А в чём смысл тогда? Вроде, lock должен сделать тот поток, который этот lock применяет, "более главным" в смысле владения объектом, который lock блокирует. А так получается, что можно и без lock блокировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 19:50
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42skyANAпропущено... Простыми словами lock блокирует участок кода. И если поток доходит до этого участка, а он в это время выполняется другим потоком, то первый подождёт последнего. Т. е. тот поток, который заблокировал объект IEnumerable, будет ждать тот поток, который его не блокировал?Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 19:54
|
|||
---|---|---|---|
|
|||
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42, Щас придет свеном, и расскажет вам про критические дни с примерами кода, если сами не можете понять эту безделицу ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 19:58
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
При помощи lock фрагмент кода помечается как критическая секция. То есть блокируется не объект, а кусок кода. Например у Вас есть кусок кода записи в файл, Вы обрамляете его инструкцией lock. Один поток начал выполнять запись в файл (начал выполнять кусок кода внутри lock). В это время второй поток тоже дошёл до этого места. Вот второму придётся подождать, пока первый закончит записывать файл :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 20:53
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
skyANAПри помощи lock фрагмент кода помечается как критическая секция. То есть блокируется не объект, а кусок кода. Например у Вас есть кусок кода записи в файл, Вы обрамляете его инструкцией lock. Один поток начал выполнять запись в файл (начал выполнять кусок кода внутри lock). В это время второй поток тоже дошёл до этого места. Вот второму придётся подождать, пока первый закончит записывать файл :) А если второй начал писать в файл раньше, но без lock, а первый дошёл до этого места и хочет писать тоже, но уже с lock? Я вот эту ситуацию спрашивал. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 20:57
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42А если второй начал писать в файл раньше, но без lock, а первый дошёл до этого места и хочет писать тоже, но уже с lock? Я вот эту ситуацию спрашивал.Разумеется, оба будут писать одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 21:32
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42А если второй начал писать в файл раньше, но без lock, а первый дошёл до этого места и хочет писать тоже, но уже с lock? Я вот эту ситуацию спрашивал. Если один поток выполняет что-то внутри lock(someObject), то другой поток ни в одну другую секцию lock(someObject) зайти не сможет, пока первый ее не закончит ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 21:47
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
При условии, что SomeObject - один и тот же объект (и не null) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 22:53
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42skyANAПри помощи lock фрагмент кода помечается как критическая секция. То есть блокируется не объект, а кусок кода. Например у Вас есть кусок кода записи в файл, Вы обрамляете его инструкцией lock. Один поток начал выполнять запись в файл (начал выполнять кусок кода внутри lock). В это время второй поток тоже дошёл до этого места. Вот второму придётся подождать, пока первый закончит записывать файл :) А если второй начал писать в файл раньше, но без lock, а первый дошёл до этого места и хочет писать тоже, но уже с lock? Я вот эту ситуацию спрашивал.До этого места, но уже с lock? Код в студию! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 04:12
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
skyANAНемоКэп42пропущено... А если второй начал писать в файл раньше, но без lock, а первый дошёл до этого места и хочет писать тоже, но уже с lock? Я вот эту ситуацию спрашивал.До этого места, но уже с lock? Код в студию! Аааа! Понял! Кто первый попал в эту секцию, тот первый и заблокировал эту секцию. Одновременно с lock и без lock это я тоже сглупил. Меня смущает то, что почему-то lock делается на объекте, а блокируется секция кода. А зачем объект-то нужен, если он сам по себе не блокируется? В примерах с МСДНа объект thisLock вообще непонятно, для чего нужен - как будто lock'у надо сфокусироваться именно на каком-то объекте, но блокирует он УЧАСТОК КОДА. Зачем thisLock нужен, если он в этом участке кода даже не участвует? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 04:13
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
Для меня было бы логично, что блокируется именно объект, который используется в заблокированном участке кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 04:18
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
А вот этот комментарий вообще убивает всю логику во мне. Т. е. объект под lock'ом не блокируется! Т. е. с помощью lock вообще нельзя защитить данные от одновременного изменения! Похоже, что МС выбрала неудачную семантику для своей конструкции с lock, потому что более половины народу в той теме на SO, похоже, понимает под lock(thisLock) именно как защиту thisLock от изменения другими потоками, пока исполняется секция lock. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 04:34
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
Сразу второй вопрос. Как сделать так, чтобы при изменении коллекции IEnumerable в одном потоке, в другом потоке нормально прошла операция энумерации по этой коллекции? А то постоянные ошибки "Collection was modified; enumeration operation may not execute". При этом мне важен порядок следования, т. е. всякие ConcurrentBag не подходит. Более того, иногда коллекция не просто изменяется, а полностью перезаписывается. Как сделать так, чтобы поток, который её считывает, успел считать её всю до того, как другой поток её полностью перезапишет? Считывающий поток должен показывать как бы анимацию изменения коллекции. Не обязательно все состояния-кадры, но хотя бы некоторые промежуточные. Т. е. эти состояния-кадры должны быть считаны полностью, без влияния процесса изменения состояния коллекции прямо во время считывания этого состояния. У меня идея, что ни одна коллекция из ConcurrentCollections тут не подходит. Похоже, что надо делать свой вариант, где хранить каждое состояние коллекции в виде отдельной копии. Скажем, Queue<List<double>>. Тогда при каждом изменении коллекции записывать её в очередь тем потоком, который изменяет эту коллекцию, а другим потоком, который считывает эту коллекцию, делать Enqueue. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 06:06
|
|||
---|---|---|---|
|
|||
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42понимает под lock(thisLock) именно как защиту thisLock от изменения другими потоками, пока исполняется секция lock. Учитывая, что в 90% случаев thisLock объявляется как Код: c# 1.
вышеописанное понимание более чем странное. Что они собрались изменять в экземпляре pure object? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 08:19
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
Сон Веры ПавловныНемоКэп42понимает под lock(thisLock) именно как защиту thisLock от изменения другими потоками, пока исполняется секция lock. Учитывая, что в 90% случаев thisLock объявляется как Код: c# 1.
вышеописанное понимание более чем странное. Что они собрались изменять в экземпляре pure object? Тогда зачем нужно писать lock(thisLock)? Зачем для запирания кода нужен какой-то объект, который в этом коде не участвует? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 08:51
|
|||
---|---|---|---|
|
|||
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42Тогда зачем нужно писать lock(thisLock)? Зачем для запирания кода нужен какой-то объект, который в этом коде не участвует? Затем, что блокировка накладывается на вполне определенный объект (более того, объектов для lock вполне может быть более одного). После наложения блокировки остальные потоки ждут освобождения, чтобы после её получения иметь возможность выполнять код (критическую секцию) далее. В принципе, конструкты с lock вполне можно переписать с использованием мониторов - возможно, так станет понятнее. P.S. Изучите: http://www.albahari.com/threading/part2.aspx#_Locking ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 09:40
|
|||
---|---|---|---|
|
|||
Как именно происходит блокировка (lock)? |
|||
#18+
Сон Веры ПавловныВ принципе, конструкты с lock вполне можно переписать с использованием мониторов Ну и да, кстати: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Метод Test() компилируется в Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 10:39
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42Тогда зачем нужно писать lock(thisLock)? Зачем для запирания кода нужен какой-то объект, который в этом коде не участвует?Срочно в Гугл читать про "монитор Хоара". ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 10:43
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
НемоКэп42Для меня было бы логично, что блокируется именно объект, который используется в заблокированном участке кода.Простите, но с логикой у Вас слабовато. Впрочем как и у многих новичков. У Вас вылетает исключение "Collection was modified; enumeration operation may not execute", которое явно говорит о том, что в процессе того как поток #1 читал данные, поток #2 изменил коллекцию и #1 не может продолжить чтение. Даже если бы lock работал по Вашей логике, то чтобы от этого изменилось? Поток #1 "замрёт", пока #2 изменяет коллекцию, "отомрёт" и возникнет таже самая ситуация: "Collection was modified; enumeration operation may not execute". Вместо того, чтобы фантазировать, Вам следует прочитать комментарий от Pallaris ( 16647244 ) и заключить фрагмент кода чтения, и фрагмент кода изменения коллекции в Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 10:46
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
skyANAПростите, но с логикой у Вас слабовато. Впрочем как и у многих новичков.Не хамите. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 10:48
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
cdtyjvskyANAПростите, но с логикой у Вас слабовато. Впрочем как и у многих новичков.Не хамите.Свеном, отвали, не тебе меня манерам учить. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 10:55
|
|||
---|---|---|---|
Как именно происходит блокировка (lock)? |
|||
#18+
skyANAНемоКэп42Для меня было бы логично, что блокируется именно объект, который используется в заблокированном участке кода.Простите, но с логикой у Вас слабовато. Впрочем как и у многих новичков. У Вас вылетает исключение "Collection was modified; enumeration operation may not execute", которое явно говорит о том, что в процессе того как поток #1 читал данные, поток #2 изменил коллекцию и #1 не может продолжить чтение. Даже если бы lock работал по Вашей логике, то чтобы от этого изменилось? Поток #1 "замрёт", пока #2 изменяет коллекцию, "отомрёт" и возникнет таже самая ситуация: "Collection was modified; enumeration operation may not execute". Вместо того, чтобы фантазировать, Вам следует прочитать комментарий от Pallaris ( 16647244 ) и заключить фрагмент кода чтения, и фрагмент кода изменения коллекции в Код: c# 1. 2. 3. 4.
Тогда поток #2 подождёт пока поток #1 прочитает коллекцию, прежде чем её изменять. Ну или наоборот: #1 подождёт пока #2 изменит коллекцию, прежде чем читать. В зависимости от того, кто первый начнёт выполнять свой кусок кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&tablet=1&tid=1402405]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 356ms |
total: | 496ms |
0 / 0 |