|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Скажем, Queue. В одном потоке делаю Enqueue, а в другом периодически проверяю свойство Count - не меньше ли оно какого-то значения - и делаю Dequeue. Не обязательно же в таком сценарии использовать потокобезопасную очередь? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 09:18 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Я имею ввиду без блокировок и прочего. Чисто логикой использования обеспечить потокобезопасность. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 09:18 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
В моём случае получается, что даже исключение о пустой очереди при использовании Dequeue не будет кидаться, т. к. Count может только увеличиться или остаться неизменным, а я всё время проверяю этот Count. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 09:20 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
НемоКэп42 , Нет, так использоваться нельзя. Почитайте про volatile . ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 09:29 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
НемоКэп42исключение о пустой очереди при использовании Dequeue не будет кидаться, т. к. Count может только увеличиться или остаться неизменным, При Dequeue Count вобще то уменьшается cdtyjvНет, так использоваться нельзя. Почитайте про volatile . Можно, но с доработками, что то типа: Код: c# 1. 2. 3. 4. 5. 6.
Правда я все равно бы использовал ConcurrentQueue<T> ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 10:11 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Arm79cdtyjvНет, так использоваться нельзя. Почитайте про volatile . Можно, но с доработками, что то типа: Код: c# 1. 2. 3. 4. 5. 6.
Во-первых: НемоКэп42Я имею ввиду без блокировок и прочего. Чисто логикой использования обеспечить потокобезопасность. Во-вторых: ваш пример вообще некорректен. Несинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы. В итоге, вы продолбаете Dequeue(). Вам тоже надо почитать про volatile . ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 10:14 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjvНесинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы А подумать? Да, при опросе может быть 0, и при этом в очереди быть элементы, но обычно опрос периодический. И на следующей итерации точно будут считаны все элементы в очереди. Так что советую вам не увлекаться volatile ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 10:18 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
обезопасить получения числа можно через статический враппер Synchronized, если уж тут не идет разговор о работе с перечислениями ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 10:28 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Arm79cdtyjvНесинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы А подумать? Да, при опросе может быть 0, и при этом в очереди быть элементы, но обычно опрос периодический. И на следующей итерации точно будут считаны все элементы в очереди. Так что советую вам не увлекаться volatileА кто вам дал гарантию, что на следующей итерации вы увидите новое значение? Сами выдумали? Про модели памяти что-нибудь слышали? Какие гарантии на чтение дает Java/.Net знаете? Если нет, то расскажу - эти платформы гарантируют, что при обычном чтении переменной вы увидите одно из значений записанных в нее ранее (это отбрасывает out-of-thin-air значения). Нет никаких гарантий, что вы когда-либо увидите самое последнее значение. Погуглите про классический пример, когда один поток в цикле читает булевский флажок, другой поток меняет его на обратный, а первый так и продолжает кружиться в бесконечнои цикле. Это прекрасно вопсроизводится и в Java, и в .Net. И как вы тогда будете писать код под такой сценарий? Или же напишете в коде комментарий, что с вашей оберткой нельзя работать в while() цикле? Курам на смех такие решения. Есть модель памяти, есть правила работы многопоточных приложений, нормальные программисты им следуют. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 10:37 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjvИ как вы тогда будете писать код под такой сценарий? Или же напишете в коде комментарий, что с вашей оберткой нельзя работать в while() цикле? Курам на смех такие решения. Есть модель памяти, есть правила работы многопоточных приложений, нормальные программисты им следуют. Ну вот не знаю как. Столько лет пишу, и ни разу не было зацикливание. Всегда все было прекрасно. И тут пришел свеном и популярно объяснил, что я не прав. Странно, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 10:56 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Arm79Ну вот не знаю как. Столько лет пишу, и ни разу не было зацикливание. Всегда все было прекрасно. И тут пришел свеном и популярно объяснил, что я не прав. Странно, да?Ну да, столько написали некорректный говнокод, который может бомбануть в любую минуту по независящим от вас причинам (например, потому что разработчики из Microsoft внесли какое-нибудь изменение в register allocator своего JIT-компилятора, из-за чего не-волатильное значение конкретно в вашем сценарии стало более агрессивно кэшироваться в регистре процессора). А хренею, конечно. Только на SQL.ru я встречаю "специалистов", которые могут с пеной у рта отстаивать некорректный говнокод, игнорируя все мыслимые и немыслимые рекомендации MSDN-ов. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:16 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Свеном, ну дак иди отсюда, не трать в пустую своё драгоценное время. У тебя ещё дом не построен и курсы не готовы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:28 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
skyANA , Мне некуда идти, я поднимаю с колен индустрию программирования в России. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:33 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
skyANA , А, стоп. То есть вы тоже такой код пишете? А ваши chief apricot'ы знают об этом? Или же вы все таки считаете неприемлемым писать некорректный код, игнорирующий модель памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:34 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjv skyANA , Мне некуда идти, я поднимаю с колен индустрию программирования в России.Каким образом? Троллением на SQL.ru? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:37 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjv skyANA , А, стоп. То есть вы тоже такой код пишете? А ваши chief apricot'ы знают об этом? Или же вы все таки считаете неприемлемым писать некорректный код, игнорирующий модель памяти?Толсто, Свеном. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:37 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
ну а что будет если читать количество без блокировки? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:39 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
skyANA , Да я просто пытаюсь понять, по какой причине вы обвиняете меня в троллинге. Вот наш коллега предложил код: Arm79Можно, но с доработками, что то типа: Код: c# 1. 2. 3. 4. 5. 6.
Мне, как спецу по многопоточности, очевидно, что этот код некорректен. Разумеется, я об этом так и говорю - код некорректен. Тут приходите вы, и говорите про какой-то троллинг. В чем он заключается? Потому я и пытаюсь понять - либо вы не видите в этом коде ошибки, либо же вы считаете, что указывать на чужие ошибки это троллинг, либо что-то третье. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:42 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjvМне, как спецу по многопоточности, очевидно, что этот код некорректен. Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:45 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Где-то в степи , Будет следующее: - Сегодня вы запустите этот код, и он отработает нормально. - Потом вы еще несколько лет попишете такой же код, и он тоже будет работать. - А потом он сломается. Либо после апдейта .Net, либо после того, как ваш коллега поменяет две независимые строчки местами, либо просто после того, как ваш сервер переедет на новое железо, либо просто после того, как звезды неправильно стали на небе. А всего то надо было понять модель памяти .Net. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:46 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Вообще-то, Свеном, я тебе не про код писал. Перечитай. Переходы на личности в виде "специалистов, которые могут с пеной у рта", поднимание с колен, упоминание chief apricot'ов, - всё это к теме топика и предлагаемым автору подходам не относится, а является простым троллингом. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:51 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
Arm79Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...В том то и дело, что затруднит! В это и заключается сложность многопоточной разработки - вы можете годами считать, что у вас все нормально, хотя на самом деле ходите по краю пропасти. Я с вероятностью 99% не смогу написать тест, который сломает ваш код. Он будет работать. Но код при этом некорректен. И эти два утверждения не противоречат друг другу. Когда я рассказываю людям про многопоточность в Java, я им показываю два сценария, в которых неследование модели памяти ломает код - один с while-циклом, про который я говорил выше, а другой c final (неким аналогом readonly в Net). И я им показываю сгенерированный ассемблерный код с пояснением, что именно сломалось. Так знаете в чем комичность этой ситуации? В том, что эти мои два сценария могут запросто ... начать нормально работать при апдейте JVM, при переезде на новый компьютер, и т.д.. Суть проблемы заключается в том, что если вы следуете модели памяти, то ваш код будет работать всегда. Если вы ей не следуете, то его работоспособность начинает зависеть уже не от вас, а от разработчиков процессоров и разработчиков .Net. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:55 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjv, в среднестатическом исполнении очередь чистится с одного конца ( в одном месте) Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 11:58 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
cdtyjvArm79Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...В том то и дело, что затруднит! В это и заключается сложность многопоточной разработки - вы можете годами считать, что у вас все нормально, хотя на самом деле ходите по краю пропасти. Я с вероятностью 99% не смогу написать тест, который сломает ваш код. Он будет работать. Но код при этом некорректен. И эти два утверждения не противоречат друг другу. Когда я рассказываю людям про многопоточность в Java, я им показываю два сценария, в которых неследование модели памяти ломает код - один с while-циклом, про который я говорил выше, а другой c final (неким аналогом readonly в Net). И я им показываю сгенерированный ассемблерный код с пояснением, что именно сломалось. Так знаете в чем комичность этой ситуации? В том, что эти мои два сценария могут запросто ... начать нормально работать при апдейте JVM, при переезде на новый компьютер, и т.д.. Суть проблемы заключается в том, что если вы следуете модели памяти, то ваш код будет работать всегда. Если вы ей не следуете, то его работоспособность начинает зависеть уже не от вас, а от разработчиков процессоров и разработчиков .Net. Иными словами, ты теоретизируете. На практике такой код 100% рабочий. Что будет через несколько лет - я не знаю, но проблем не возникло ни на моей рабочей машине (Win XP, количество ядер не помню, Win 7 - 8 ядер, Windows 2003 и Windows 8 - 48 ядер десятки серверов). Через несколько лет и метеорит может ударить. И сервер отключится. На все не заложишься. Кстати, вы плохо прочитали исходный пост: я сказал, что на практике предпочитаю lock-free модель, и юзаю ConcurrentQueue ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 12:01 |
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
---|---|---|---|
#18+
НемоКэп42Скажем, Queue. В одном потоке делаю Enqueue, а в другом периодически проверяю свойство Count - не меньше ли оно какого-то значения - и делаю Dequeue. Не обязательно же в таком сценарии использовать потокобезопасную очередь? Используй ConcurrentQueue и забудь о страхах. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2014, 12:03 |
|
|
start [/forum/topic.php?fid=20&msg=38756991&tid=1402419]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 185ms |
0 / 0 |