Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Иными словами, ты теоретизируете. На практике такой код 100% рабочий.Это не я теоретизирую. Это MSDN просит вас писать код в соответствии с моделью памяти. Если вы считаете, что забивать на советы разработчиков платформы - ваше право. Писать говнокод - ваше право. Но пожалуйста - не надо советовать писать говнокод другим людям . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:10 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Свеном, так дай ТСу пример хорошего кода, решающего его проблему. Ну или ссылку на почитать. Пока твои выпады выглядят толсто и бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:14 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA , Что ему советовать? Он итак прекрасно знает, что надо использовать Concurrent* классы, перечитайте его вопрос. Вопрос был в том, можно ли как-то расслабить это в его сценарии. Ответ простой - нет, нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:17 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv skyANA , Что ему советовать?Ссылку на почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:22 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANAСсылку на почитать.Может быть еще и прочитать за него? У меня такое ощущение, что вам лишь бы что-то сказать, но что бы это было сказано последним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvто ему советовать? Он итак прекрасно знает, что надо использовать Concurrent* классы, перечитайте его вопрос. Вопрос был в том, можно ли как-то расслабить это в его сценарии. Ответ простой - нет, нельзя. Как нельзя? Зачем же вы советовали volatile? Неужто эксперт дал бессмысленный совет? Или не в состоянии привести с ним корректный пример? Расскажите, как эксперт, поможет ли применение барьеров памяти в моем коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvУ меня такое ощущение, что вам лишь бы что-то сказать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:25 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79cdtyjvто ему советовать? Он итак прекрасно знает, что надо использовать Concurrent* классы, перечитайте его вопрос. Вопрос был в том, можно ли как-то расслабить это в его сценарии. Ответ простой - нет, нельзя. Как нельзя? Зачем же вы советовали volatile? Неужто эксперт дал бессмысленный совет? Или не в состоянии привести с ним корректный пример? Расскажите, как эксперт, поможет ли применение барьеров памяти в моем коде? я думаю есть смысл сделать свою обертку на queue, где будет синхронизирован доступ и всякие Count как раз volitale. Хотя значение этого слова свеном явно преувеличивает. Кстати такая обретка у меня где-то была. В те далекие Net 2.0 ей пользовался) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:27 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvskyANAСсылку на почитать.Может быть еще и прочитать за него? У меня такое ощущение, что вам лишь бы что-то сказать, но что бы это было сказано последним.Нет читать он сам будет. В сухом остатке, что ты написал: volatile, MSDN. Ну воспользуется ТС поиском в MSDN, ну получит "Results 1-20 of about 79,900 for: volatile c#". Забьёт. P.S.: я в отпуске, раскладываю вещи после возвращения из Крыма и стирки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
вот нашел. файл прикладываю. там даже все по науке. Свеному понравится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
netivanвот нашел. файл прикладываю. там даже все по науке. Свеному понравится http://www.sql.ru/forum/actualfile.aspx?id=16620467] Приложенный файл (NewQueue.cs - 5Kb) Ну это не обёртка, а свой класс :-) Выбивается за рамки топика. Вопрос то был про обычную Queue Может, имело смысл унаследоваться от Queue, переопределить свойство через new, а бакэнд поле сделать volatile? Пока иных применений этому слову я не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:33 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79netivanвот нашел. файл прикладываю. там даже все по науке. Свеному понравится http://www.sql.ru/forum/actualfile.aspx?id=16620467] Приложенный файл (NewQueue.cs - 5Kb) Ну это не обёртка, а свой класс :-) Выбивается за рамки топика. Вопрос то был про обычную Queue Может, имело смысл унаследоваться от Queue, переопределить свойство через new, а бакэнд поле сделать volatile? Пока иных применений этому слову я не вижу. ну да. я просто забыл даже как там было сделано :) Но помойму проще всего в "лоб" lock(sync) на все операции. Откровенно говоря "тормоза" от этого вряд ли будут заметны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 12:36 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
А эти Concurrent не сильно много производительности и потребления памяти используют, по сравнению с не Concurrent? У меня не библиотека и не какой-то код, от которого кто-то наследоваться будет. У меня однозначно в одном потоке добавляются данные в очередь, а в другом - берутся из неё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 21:52 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
НемоКэп42А эти Concurrent не сильно много производительности и потребления памяти используют, по сравнению с не Concurrent? Они там вообще как построены? Может, на банальных lock'ах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 21:53 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
НемоКэп42НемоКэп42А эти Concurrent не сильно много производительности и потребления памяти используют, по сравнению с не Concurrent? Они там вообще как построены? Может, на банальных lock'ах?Возьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает. Мы же не знаем где и как Вы у себя очереди используете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 21:56 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANAВозьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает. Мы же не знаем где и как Вы у себя очереди используете.Какой еще JustDecompile? Во-первых, если уж брать дизассемблер, то ILSpy, а не эту фигню. Во-вторых, что бы посмотреть исходники mscorlib, достаточно просто открыть Гугл, и вбить там ".net reference source". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 22:10 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvskyANAВозьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает. Мы же не знаем где и как Вы у себя очереди используете.Какой еще JustDecompile? Во-первых, если уж брать дизассемблер, то ILSpy, а не эту фигню. Во-вторых, что бы посмотреть исходники mscorlib, достаточно просто открыть Гугл, и вбить там ".net reference source". У меня решарпер открывает исходники. По возможности, качает, если нет - декомпилирует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 23:23 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
netivanвот нашел. файл прикладываю. там даже все по науке. Свеному понравится Посмотрел код. 1. Непонял зачем выкрутасы в Enqueue Код: c# 1. 2. 3. 2. Непонял зачем страдания в TryDequeue. Достаточно уменьшить _count. 3. проблемы с памятью. добавь и удали один елемент. остаётся живая ссылка. 4. сильно не проверял но т.к. _tail может содержать ссылку не на последний елемент списка, то вся конструкция вызывает сомнения. Ну а в обшем пример показательный. чаше проще lock-ат обект чем написать беошибочный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2014, 23:49 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron, по первому, в код не вникал, но наверное проверка что не залез кто то из другого потока, по остальному, при беглом взгляде в сети данный код используется в около сотни проектах, наверное можно его считать верифицированным ( условно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 00:39 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
netivan , Ага, настолько по науке, что на любой Enqueue делается минимум по два CAS-а, есть дополнительный cmpxchg и race condition на никому не нужном _count, а Clear() не потокобезопасен. Мрак. Смотрите в Java, класс ConcurrentLinkedQueue - именно так должна выглядеть эффективная потокобезопасная очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 08:44 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Хахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 08:46 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv netivan , Ага, настолько по науке, что на любой Enqueue делается минимум по два CAS-а, есть дополнительный cmpxchg и race condition на никому не нужном _count, а Clear() не потокобезопасен. Мрак. Смотрите в Java, класс ConcurrentLinkedQueue - именно так должна выглядеть эффективная потокобезопасная очередь. какой-то ты набор слов написал непонятный. Мне срать что там в яве, человек просил кастомный класс ему скинул. авторХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО! напиши идеальный, оценим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:13 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvskyANAВозьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает. Мы же не знаем где и как Вы у себя очереди используете.Какой еще JustDecompile? Во-первых, если уж брать дизассемблер, то ILSpy, а не эту фигню. Во-вторых, что бы посмотреть исходники mscorlib, достаточно просто открыть Гугл, и вбить там ".net reference source".Свеном, я посоветовал новичку, что по проще. У тебя какие-то проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:15 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО ! Критиковать каждый горазд, особенно старый код под .net2. Мы ждем вашего кода. С volatile в пределах заданного ТС коридора. Кстати, товарищ эксперт, если мой код исправить так, вас это устроит? Код: c# 1. 2. 3. 4. 5. 6. Зачем нам смотреть в Java, когда есть ConcurrentQueue и его исходники? Чем он так плох? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:17 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv, и еще для тупых и слепых: Код: c# 1. 2. 3. 4. авторСвеном, я посоветовал новичку, что по проще. У тебя какие-то проблемы? да чего с него взять? Он наверное в блокноте пишет, он же гуру. и компилит все в мозгу своем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:17 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79cdtyjvХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО ! Критиковать каждый горазд, особенно старый код под .net2. Мы ждем вашего кода. С volatile в пределах заданного ТС коридора. Кстати, товарищ эксперт, если мой код исправить так, вас это устроит? Код: c# 1. 2. 3. 4. 5. 6. Зачем нам смотреть в Java, когда есть ConcurrentQueue и его исходники? Чем он так плох? он еще его не завизировал, вот чем плох он! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:18 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
netivanавторХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО! напиши идеальный, оценимОн только по чужим исходникам на Java способен код на C# писать. И у него это плохо получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:18 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Где-то в степиmikron, по первому, в код не вникал, но наверное проверка что не залез кто то из другого потока, Вот я и спрашиваю, как эта "проверка" работает? что удержит оптимизатор от её полного удаления за ненужностю? Оптимизатор может зделать и так. Код: c# 1. 2. 3. 4. 5. Тогда очевидно, что она безполезна. Где-то в степипри беглом взгляде в сети данный код используется в около сотни проектах, наверное можно его считать верифицированным ( условно) Вот она чудотворящая сила копипасты. Иммено так количество переходит в качество. Ещё одно подверждение марксистко ленинской диалектической теории :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:34 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron[src c#] oldTail = _tail; oldTailNext = oldTail.Next; if (_tail == oldTail) // Optimisation can remove comparission Откуда это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:54 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Вот , хороший пост Эрика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:58 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВmikron[src c#] oldTail = _tail; oldTailNext = oldTail.Next; if (_tail == oldTail) // Optimisation can remove comparission Откуда это? 16620467 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 10:58 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
netivanнапиши идеальный, оценимЗачем мне писать свой, если уже все написано? Причем написано эффективно и корректно, в отличие от вашей реализации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Кстати, товарищ эксперт, если мой код исправить так, вас это устроит? Код: c# 1. 2. 3. 4. 5. 6. В вашем коде есть три ошибки: 1) Он не компилируется, так как в VolatileRead надо отдавать адрес переменной, а вы туда отдаете свойство, чего делать нальзя. 2) Нужен lock(queue) и в другом треде, который делает Enqueue(). Вы про это не упомянули, а значит и не подумали. 3) Если бы Thread.VolatileRead(queue.Count) все таки работал, то он не нужен был бы внутри lock(queue), хватило бы и обычного чтения. Двойка вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:32 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronГде-то в степиmikron, по первому, в код не вникал, но наверное проверка что не залез кто то из другого потока, Вот я и спрашиваю, как эта "проверка" работает? что удержит оптимизатор от её полного удаления за ненужностю?Да ничего. Поля не волатильны, оптимайзер волен делать, что захочет. Но вот Arm79 считает, что это казуистика, и такой код всегда работает, а модель памяти придумали ботаны-теоретики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:34 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВ Вот , хороший пост Эрика. Бесполезное гонево ламера, причем 5-летней давности. Откровенный бред человека, который в самом начале признается в своей некомпетентности. Я бы не стал "козырять" такими позорными темами. P.S. Возможно сейчас у этого веб евангелиста мнение поменялось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:41 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvArm79Кстати, товарищ эксперт, если мой код исправить так, вас это устроит? Код: c# 1. 2. 3. 4. 5. 6. В вашем коде есть три ошибки: 1) Он не компилируется, так как в VolatileRead надо отдавать адрес переменной, а вы туда отдаете свойство, чего делать нальзя. 2) Нужен lock(queue) и в другом треде, который делает Enqueue(). Вы про это не упомянули, а значит и не подумали. 3) Если бы Thread.VolatileRead(queue.Count) все таки работал, то он не нужен был бы внутри lock(queue), хватило бы и обычного чтения. Двойка вам. Пичалька. Я действительно не проверял код, но касаемо 3 пункта вы неправы. Если lock объекта отнюдь не означает, что синхронизируются по всех процессорных кэшах значение всех его полей. Пункт 2 - это лишь ваши фантазии, о чем я там думал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:49 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79о касаемо 3 пункта вы неправы. Если lock объекта отнюдь не означает, что синхронизируются по всех процессорных кэшах значение всех его полей.Как раз таки означает. Если бы этого не было, то следующий код бы не работал, а он работает: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Все, я заканчиваю с вами диалог. Разберитесь сначала с моделью памяти, потом поговорим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:56 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruЕвгенийВ Вот , хороший пост Эрика. Бесполезное гонево ламера, причем 5-летней давности. Откровенный бред человека, который в самом начале признается в своей некомпетентности. Я бы не стал "козырять" такими позорными темами. P.S. Возможно сейчас у этого веб евангелиста мнение поменялось. МСУ, Гайдар в принципе на такие статьи не способен, это перевод блога Эрика Липперта , который не самый последний стековерфлоу и который много лет делал .NET и С#, всякие там деревья выражений, женерики и прочие контрвариантности и чем там ты еще там пользуешься, его рук дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 11:58 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79lock объекта отнюдь не означает, что синхронизируются по всех процессорных кэшах значение всех его полей cdtyjvКак раз таки означает Да, действительно, тут я дал маху. cdtyjvНо вот Arm79 считает, что это казуистика, и такой код всегда работает Но тут я по прежнему на своем стою - тот код, который я привел, рабочий. Тот, а не такой. Разница есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:18 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Но тут я по прежнему на своем стою - тот код, который я привел, рабочий. Тот, а не такой. Разница есть.Да ради бога. Разнесут вас на очередном собеседовании за такой код - может быть начнете по-другому смотреть на вещи. Код бывает либо корректный, либо нет. Ваш код некорректен, точно так же, как и код нашего коллеги, реализовавшего нерабочую конкурентную очередь. Никаких "конкретно мой" здесь нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:22 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvн Еще раз: 1 итерация: Читающий поток смотрит на количество. Видит 0, не исполняется ничего 2 итерация: читающий поток видит количество 2 (хотя допустим, пишущие потоки закинули туда 10 объектов, и Count не синхронизирован). Входит lock, где Count уже засинхронизирован и там уже 10, то есть Count корректен. Обрабатывает эти 10 элементов. Фактически ваша претензия сводится к тому, что объекты в очереди будут обработаны в разных итерациях, что при периодическом опросе несущественно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:26 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79 , Вовсе нет. Моя претензия заключается в том, что если один поток положил элемент в очередь и изменил _count с 0 на 1, то второй поток может продолжать видеть 0 неограниченно долго . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:31 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВМСУ, Гайдар в принципе на такие статьи не способен, это перевод блога Эрика Липперта Да, я верю, что он тру кодер, но после таких слов ...За всю мою карьеру, необходимость написать код, который запускает второй рабочий поток, возникала, вероятно, менее полудюжины раз. вникать в его поток воображения стало лень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:32 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ru...За всю мою карьеру, необходимость написать код, который запускает второй рабочий поток, возникала, вероятно, менее полудюжины раз. вникать в его поток воображения стало лень.Все правильно он написал. Так как преимущественно используют тред-пулы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:42 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv Arm79 , Вовсе нет. Моя претензия заключается в том, что если один поток положил элемент в очередь и изменил _count с 0 на 1, то второй поток может продолжать видеть 0 неограниченно долго . Но ведь видит же? Может, потому, что при записи в эту очередь тоже lock и там обновляются значения Count? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:42 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Но ведь видит же? Может, потому, что при записи в эту очередь тоже lock и там обновляются значения Count?Нет гарантий, что чтение переменной вне лока увидит изменение, которое внес другой поток внутри лока. Что бы его увидеть нужен барьер памяти до чтения, которого в вашем случае нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:44 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvArm79Но ведь видит же? Может, потому, что при записи в эту очередь тоже lock и там обновляются значения Count?Нет гарантий, что чтение переменной вне лока увидит изменение, которое внес другой поток внутри лока. Что бы его увидеть нужен барьер памяти до чтения, которого в вашем случае нет. Так это если разовое. Если речь о периодическом опросе, то проблем не будет, Count будет прекрасно меняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:46 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Вот код, компилировал его в Release, запускал вне студии. Раз 10 запускал на 8ядерной машине, не разу не зависло. Обратите внимание, сначала запускал читающий поток, чтобы гарантированно первой итерацией не проскакивать в lock. Код: c# 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 12:58 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvВсе правильно он написал. Так как преимущественно используют тред-пулы. Причем тут это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:06 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79 , Код: c# 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. 1) Скомплиировать в Release. 2) Запустить без дебагера. Еще вопросы будут у вас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:27 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruПричем тут это?При том, что нет ничего страшного в том, что человек редко запускает потоки руками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv Arm79 , Код: c# 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. 1) Скомплиировать в Release. 2) Запустить без дебагера. Еще вопросы будут у вас?Что показать-то хотел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:32 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvcodearticles.ruПричем тут это?При том, что нет ничего страшного в том, что человек редко запускает потоки руками. Какую-то чушь ты пишешь. Сначала пишешь про использование тредпулов, потом о редкости запуска потоков руками. Возьмем WPF к примеру. Как ты там собрался использовать многопоточность, не используя вторых и последующих потоков? Или тредпул сам волшебным образом будет всё параллелить? Я, конечно, допускаю твой опус о том, что ты имел ввиду веб приложения, где реквесты параллелит IIS. Но это частность и никакого отношения к теме не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:35 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA, .Net 4.5, Windows 7.1, не останавливается. Как я уже писал выше, спокойно может работать на другой конфигурации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:38 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ru, А автор, которого вы обосрали, гдето писал, что он приклдной разработчик WPF? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:40 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA, Ну и плюс вы не из консоли запустили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:41 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruЕвгенийВМСУ, Гайдар в принципе на такие статьи не способен, это перевод блога Эрика Липперта Да, я верю, что он тру кодер, но после таких слов ...За всю мою карьеру, необходимость написать код, который запускает второй рабочий поток, возникала, вероятно, менее полудюжины раз. вникать в его поток воображения стало лень. Есть такие задачи, которые не особо расспараллелишь, например когда для последующего шага нужен результат текущего. Напиши например "банальный многопоточный" генератор чисел Фиббоначи. Или там генератор всех возможных программ на C#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:43 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvskyANA, Ну и плюс вы не из консоли запустили.Не понял, а из чего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:45 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvskyANA, .Net 4.5, Windows 7.1, не останавливается. Как я уже писал выше, спокойно может работать на другой конфигурации.Что-то слабо верится. .Net 4.5, Windows Server 2008 R2 Enterprise ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:46 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvcodearticles.ru, А автор, которого вы обосрали, гдето писал, что он приклдной разработчик WPF? А автор, которого я обосрал, где-то писал, что он прикладной разработчик веб? Более того, если ты читаешь не жопой, то должен увидеть такое предостережение. ...Предостережение: я не эксперт по многопоточному программированию. На самом деле, я бы даже не стал утверждать, что я в нём компетентен. Так что воспринимайте всё, что я пишу на эту тему, с некоторым скептицизмом. А это уже первый звоночек по поводу того, а не "обосрать" ли его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:47 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВЕсть такие задачи, которые не особо расспараллелишь, например когда для последующего шага нужен результат текущего. Да что ты говоришь http://codearticles.ru/articles/2492 ЕвгенийВНапиши например "банальный многопоточный" генератор чисел Фиббоначи. http://forgetcode.com/Java/221-Multithreading-For-Prime-and-Fibonacci-numbers-using-pipes ЕвгенийВИли там генератор всех возможных программ на C#. А в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:50 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA, Еще раз — релиз поставили, дебагер отключили? Если не умеете, то скомпилируйте экзешник, потом откройте cmd руками, и запустите. Если все равно раьотает нормально — значит вам повезло. В таком случае вбейте в гугле «.net volatile infinite loop», и почитайте поимеры со стэковерфлоу. После этого ваши сомнения будут развеяны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 13:52 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv Arm79 , Код: c# 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. 1) Скомплиировать в Release. 2) Запустить без дебагера. Еще вопросы будут у вас? Да, будут. Работает ведь. Код: 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. Ядер 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:00 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvskyANA, Еще раз — релиз поставили, дебагер отключили? Если не умеете, то скомпилируйте экзешник, потом откройте cmd руками, и запустите.Ахаха. Свеном, ну не льсти ты себе так. Карму испортишь. cdtyjvЕсли все равно раьотает нормально — значит вам повезло. В таком случае вбейте в гугле «.net volatile infinite loop», и почитайте поимеры со стэковерфлоу. После этого ваши сомнения будут развеяны.Если я сюда скопирую пример из SO, то с тебя будут долго смеяться. Пусть, кому надо, сам в тихаря это сделает, чтобы тебе обидно не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:01 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79, надо на самом деле другой код компилировать и запускать. Тот, что Свеном привёл, он сам не тестировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:04 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
У него небось и студии-то под рукой нет. Такой вот тонкий троллинг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:05 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruЕвгенийВЕсть такие задачи, которые не особо расспараллелишь, например когда для последующего шага нужен результат текущего. Да что ты говоришь http://codearticles.ru/articles/2492 Я тебе про то, что есть список задач и нельзя выполнить задачу N+1 не зная результата для N и так для всего списка. Дешевый пиар ресурса. Какой ресурс, такой и пиар :) ЕвгенийВНапиши например "банальный многопоточный" генератор чисел Фиббоначи. http://forgetcode.com/Java/221-Multithreading-For-Prime-and-Fibonacci-numbers-using-pipes [/quot] Ты путаешь Божий дар с яичницей! Запустить алгоритм в отдельном потоке - не значит распараллелить его. Например сумму элементов массива можно посчитать в 2 потока, 1 считает от 0 до N/2, второй от N/2+1 до N-1, результат обеих складывется. ЕвгенийВИли там генератор всех возможных программ на C#. А в чем проблема? [/quot] Я например не могу, просвети, покажи код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:13 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA, Arm79 Ок, раз вы сами не в состоянии ... открываем архив, я вам там даже сам экзешник оставил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:26 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv skyANA, Arm79 Ок, раз вы сами не в состоянии ... открываем архив, я вам там даже сам экзешник оставил. http://www.sql.ru/forum/actualfile.aspx?id=16626057] Приложенный файл (VolatileHang.rar - 27Kb) Не знаю, что там у вас, но и ваш exe у меня работает. На слово поверите или тоже заскриншотить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Свеном, как говорится: Обосрался - обтекай! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:29 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79, да троллит он. Добавил строку Код: c# 1. 2. 3. И думает, что мы впадём в ступор от четвёртого сообщения в консоли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:33 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Ладно, побаловались, и хватит. Все равно неактуально, ConcurrentQueue наше все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:35 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Ладно, побаловались, и хватит. Все равно неактуально, ConcurrentQueue наше все. PS Забыл только добавить, что код у свенома все равно отличается от нужного. Речь шла об объекте и его поле, а свеном пытается показать проблемы с локальной переменной метода. Предлагаю свеному сделать queue полем класса, и снова попробовать свой код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:39 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Не знаю, что там у вас, но и ваш exe у меня работает. На слово поверите или тоже заскриншотить? Раз : 16620245 Два : http://stackoverflow.com/questions/133270/illustrating-usage-of-the-volatile-keyword-in-c-sharp http://stackoverflow.com/questions/17907885/c-sharp-compiler-optimization-and-volatile-keyword Три : см. аттач. Ну а вы можете продолжать писать потоконебезопасный код в предположении, что это чистая теория, которая не имеет отношения к реальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:42 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79PS Забыл только добавить, что код у свенома все равно отличается от нужного. Речь шла об объекте и его поле, а свеном пытается показать проблемы с локальной переменной метода. Предлагаю свеному сделать queue полем класса, и снова попробовать свой кодОкей, вот результаты: 1) Статическая переменная - не виснет. 2) Статический враппер внутри которого лежит очередь - виснет. 3) Создать локальную переменную, которой присвоить статическую переменную - виснет. И таких экспериментов можно уйму сделать. И как вы потом пользователю или коллеге объясните в каких случаях ваша поделка работает, а в каких нет? А никак, так как код сломан, нет гарантии, что он будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:47 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВЯ тебе про то, что есть список задач и нельзя выполнить задачу N+1 не зная результата для N и так для всего списка. Ну если у тебя весь стек задач так устроен, то да. А если 1 задача из 100 задач не зависит ни от чего, то почему бы её не распаралелить? ЕвгенийВДешевый пиар ресурса. Какой ресурс, такой и пиар :) Дешевый вброс бреда от ЕвгенийВ. Ничего ресурс винить из-за собственного криворучия :) ЕвгенийВТы путаешь Божий дар с яичницей! Запустить алгоритм в отдельном потоке - не значит распараллелить его. Собственно, и наоборот, распараллелить - это не значит использовать отдельный поток. Может быть задействован как и поток из пула, так и асинхронный вызов. Но мы не о том. Какая тебе разница, выполнится ли блок асинхронно или в отдельном треде? Отдай эту работу отдельным механизмам фреймворка. И ты получишь результат. ЕвгенийВИли там генератор всех возможных программ на C#. А в чем проблема? [/quot] Я например не могу, просвети, покажи код?[/quot] Причем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:50 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Четыре: Код: c# 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:51 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA , И в чем суть? Вы проверку размера внесли внутрь лока, разумеется все работает в таком случае. Мы говорим про вот этот код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. Опять написали, не подумав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:57 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
skyANA , Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 14:58 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruНу если у тебя весь стек задач так устроен, то да. У Эрика да. codearticles.ruСобственно, и наоборот, распараллелить - это не значит использовать отдельный поток. Может быть задействован как и поток из пула, так и асинхронный вызов. Но мы не о том. Какая тебе разница, выполнится ли блок асинхронно или в отдельном треде? Отдай эту работу отдельным механизмам фреймворка. И ты получишь результат. Еще раз повторяю, напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора. ЕвгенийВПричем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение. Напиши метод с сигнатурой IEnumerable<string> GetAllProgramms(), который вернет список ВСЕХ возможных программ на C#, в том числе которые были приведены в этом обсуждении, в этом форуме, которые написал ты, которые написали все, кого ты знаешь и т. д. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:03 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВcodearticles.ruНу если у тебя весь стек задач так устроен, то да. У Эрика да. Откуда знаешь? ЕвгенийВЕще раз повторяю, напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора. Ты прямо жжешь с каждым постом. Сначало было: ЕвгенийВНапиши например "банальный многопоточный" генератор чисел Фиббоначи. Дал код на джаве. Теперь ты вбрасываешь: ЕвгенийВнапиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора. А потом будет: напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать свечения луны и силу маха крыльев всех бабочек Земли. Так? Причем тут процессор? Откуда он взялся? Речь была о малтитрединге и в частности о распараллеливании. Выйди из сумрака. ЕвгенийВПричем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение. Напиши метод с сигнатурой IEnumerable<string> GetAllProgramms(), который вернет список ВСЕХ возможных программ на C#, в том числе которые были приведены в этом обсуждении, в этом форуме, которые написал ты, которые написали все, кого ты знаешь и т. д. :)[/quot] Ты бредишь? Я вижу, что да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:11 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN) Так что все у skyANA правильно, через lock. Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:13 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)Вы уже окончательно запутались. Вы читаете неволатильное поле Queue.count - в этом ваша ошибка. Так как оно неволатильно, ваш код и не работает. Arm79Так что все у skyANA правильно, через lock.Вот именно, что у него все правильно написано, потмоу и работает. А у вас нет, потому код не работает. Arm79Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.У вас работает. А на других окружениях нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:25 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Да уж, алгоритмическая подготовка - хуже чем плохо :( codearticles.ruДа что ты говоришь http://codearticles.ru/articles/2492 Кстати, этот код еще подойдет для начального ознакомления с тасками, чего впрочем хватает для того, что бы в простейшем случае отделить рабочий поток от гуя, рисованием которого автор видимо и занимается большую часть времени. Но каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам! codearticles.ruТы бредишь? Я вижу, что да. С твоей колокольни - да. С колокольни пишущих компиляторы - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:37 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvArm79Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)Вы уже окончательно запутались. Вы читаете неволатильное поле Queue.count - в этом ваша ошибка. Так как оно неволатильно, ваш код и не работает. Arm79Так что все у skyANA правильно, через lock.Вот именно, что у него все правильно написано, потмоу и работает. А у вас нет, потому код не работает. Arm79Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.У вас работает. А на других окружениях нет. Я не понял? :-) Еще раз, если очередь - это поле, неважно, статическое или нет, с ним все прекрасно работает. Собственно, код, который я привел, это иллюстрирует. Если вы объявляете локальную переменную и с ней занимаетесь ерундой типа замыканий, у вас проблемы. Далее, вы же говорили, что нужно использовать волатильность? Но почему примеры у вас без неё? Может, потому что локальные переменные и volatile несовместимы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:37 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВДа уж, алгоритмическая подготовка - хуже чем плохо :( Не говори. Формулирование требований и внятность изъяснения - в уверенном минусе. ЕвгенийВКстати, этот код еще подойдет для начального ознакомления с тасками, чего впрочем хватает для того, что бы в простейшем случае отделить рабочий поток от гуя, рисованием которого автор видимо и занимается большую часть времени. А почему ты считаешь, что отделение рабочего потока от гуя - детская задача? Вот, выше твой афтар даже пишет, что и такого пороха не нюхал. А ты его тут иконой ставишь. Так что не рассказывай мне про детский сад, загляни к себе в карман и найдешь кучу погремушек и даже соску. ЕвгенийВНо каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам! Садись, двойка. Количество процессоров тут второстепенно, важнее, сколько потоков на процесс я могу заполучить. Готов тебя разочаровать, 32-битный процесс с дефолтным адресным пространством может создать максимум 2048 потоков. А теперь рассказать про лимиты x64? Если у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. Твои познания в этой области ниже плинтуса. ЕвгенийВС твоей колокольни - да. С колокольни пишущих компиляторы - нет. Выдыхай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 15:46 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruСадись, двойка. Количество процессоров тут второстепенно, важнее, сколько потоков на процесс я могу заполучить. Готов тебя разочаровать, 32-битный процесс с дефолтным адресным пространством может создать максимум 2048 потоков. А теперь рассказать про лимиты x64? Если у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. Твои познания в этой области ниже плинтуса. Запусти у себя хоть столько. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Отпишешься, после перезагрузки "резетом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:13 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruЕсли у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. А объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:16 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
zzА объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь? Если выполняются ресурсоёмкие вычисления, то получим сильную конкуренцию между потоками, большие затраты на переключение контекста и как следствие результаты худшие, чем при последовательной обработке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВЗапусти у себя хоть столько. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Отпишешься, после перезагрузки "резетом". Запусти это. Отпишись, как получишь количество разных тредов, большее, чем число процессоров Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:27 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
zzcodearticles.ruЕсли у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. А объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь? Это исключительный случай, когда распараллеливание ничем не поможет. Должна быть хоть одна задача, которая не зависит от предыдущих. Тогда имеет смысл параллелить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv skyANA , Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.Скриншот внимательно смотри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:29 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВ, и да, объяснять разницу, между логическими и физическими процессорами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:34 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Это так, к слову. Код: c# 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:37 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ru Запусти это. Отпишись, как получишь количество разных тредов, большее, чем число процессоров Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Так ты делай какую нибудь полезную работенку? Хоть например дергай главного пользователя своего сайта из базенки по ID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 16:54 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВТак ты делай какую нибудь полезную работенку? Хоть например дергай главного пользователя своего сайта из базенки по ID? Да какая разница, напиши вместо Task.Yield тот же Task.Delay(10). И еще, когда последний раз букварь читал про ParallelOptions.MaxDegreeOfParallelism? Перечитай его еще разок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 17:01 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Всё дело в дефолтной установке ThreadPool.GetMinThreads, а не в количестве процессоров Тебя снова подвела безграмотность. P.S. Тем более нужно сразу говорить, что речь о логических процессорах. Чтобы не вводить никого в заблуждение. Итак, вернемся к нашим баранам :) Вот тут ты ляпнул глупость: ЕвгенийВНо каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам! Теперь ты согласен, что "надо молотком по пальцам" тебя, а не кого-то там другого? Имей честно признать, что ты слил. Честно признайся в некомпетентности и я отпущу тебя с миром. Покайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 17:17 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ru, Делай что нибудь полезное, а не жди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 17:52 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv skyANA , Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет. Мне просто интересно, на каких процессорах ты тестируеш? Тероретически на Итаниумах таки да, запись/увеличение счётчика не синхонизирует кеш лайнс. На Х86 кеши всегда когерентны. но вроде не всегда на АМД64. У них более слабая модель памяти чем Х86 но более строгая чем на итаниумах. Что за железо? А то выяснится, что как ты не показывай проблему, у всех интелы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 18:36 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Arm79Я не понял? :-) Еще раз, если очередь - это поле, неважно, статическое или нет, с ним все прекрасно работает. Собственно, код, который я привел, это иллюстрирует. Если вы объявляете локальную переменную и с ней занимаетесь ерундой типа замыканий, у вас проблемы. Вот этот код не работает, хоть очередь и "поле": Код: c# 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. Если же сделать поле статическим, то код начинает работать. Это нормально, по-вашему, писать такой код, который работает или не работает по непонятным причинам? Arm79Далее, вы же говорили, что нужно использовать волатильность? Но почему примеры у вас без неё? Может, потому что локальные переменные и volatile несовместимы?Потому что мои примеры не демонстрируют корректное решение. Они демонстрируют некорреткность вашего решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:07 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronМне просто интересно, на каких процессорах ты тестируеш? Тероретически на Итаниумах таки да, запись/увеличение счётчика не синхонизирует кеш лайнс. На Х86 кеши всегда когерентны. но вроде не всегда на АМД64. У них более слабая модель памяти чем Х86 но более строгая чем на итаниумах. Что за железо? А то выяснится, что как ты не показывай проблему, у всех интелы :)У меня Core i7. Во-первых, конкретно в этом коде проблема не в железе, а в JIT. Если вы дизассемблируете этот код, то увидите, что оптимизатор целиком выкосил проверку if (queue.Count > 0), отсюда и зависание. Во-вторых, вы верно заметили, что на x86 архитектурах как правило применяют достаточно строгую и консервативную модель памяти, которая запрещает реордеринг сторов. Она так и называется - TSO - total store order. Но она не запрещает реордеринг лоадов, поэтому вот такой код (это некая адаптация алгоритма Петерсона) на x86 не работает: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Если вы немного помедитируете над этим кодом, то увидите, что если только одна из переменных runner1WasFirst или runner2WasFirst может быть true, верно? Ну то есть нельзя на бумажке нарисовать такой сценарий, где обе эти переменных будут true. Однако, x86, в том числе мой Core i7 не гарантирует когерентности кэшей . Поэтому он спокойно может переколбасить код вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И все, ваш код сломан - у вас два бегуна прибежали первым, что невозможно. Хотя TSO сохранен. Более того, точно такой же эффект может возникнуть не только от реордеринга инструкций, но и от того, что кэши всегда становятся когерентными со временем, но не всегда когерентны в моменте. Поэтому один поток может записать флажок, а другой это не увидит. Почитайте про store buffer и invalidate queue на досуге. Кстати, примерно этот же пример приведен прямо в документации интеловских процессоров. Если очень надо будет - дам вам ссылку. В любом случае, в рассматриваемом нами некорретном коде от Arm79 проблема не в железе, а в JIT-компиляторе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:19 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvУ меня Core i7. В любом случае, в рассматриваемом нами некорретном коде от Arm79 проблема не в железе, а в JIT-компиляторе. Я таки читал что кеши в х86 и х64 когерены. Но оставим кеши в стороне. В твоём примере вынисти чтение за цикл - валидная оптимизация. И таки да, проблема должна быть видна даже на однопроцесорном тазике. Только не надо на компилятор. Проблем точно не в нём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:46 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron, Нет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue. Виной тому, что код не останавливается - именно компмлятор, и никто иной. Это сгенерировал такой ассембли, в котором проверка вынесена за цикл. Процессор так делать не умеет, он вообще не знант, что такое «цикл». Но разумеется, это не «проблема» и не баг. Это ожидаемое поведение. Проблема у нас сейчас только в том, что коллеги Arm79 и SkyAnA не умеют писать многопоточный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:54 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВcodearticles.ru, Делай что нибудь полезное, а не жди. Ты признаёшь, что опростоволосился? Ответь, будь мужчиной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 20:41 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvНет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue. Пакажи источник информации что кэши у х86 и х64 не когерентны. И может сможеш показать на примере? И ненадо стигматизировать личности. Ошибки вобще свойственны людям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 21:23 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikroncdtyjvНет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue. Пакажи источник информации что кэши у х86 и х64 не когерентны. И может сможеш показать на примере? И ненадо стигматизировать личности. Ошибки вобще свойственны людям.Давайте для начала будем употреблять термин "когерентны" правильно. Утверждение "кэши не когерентны" не верно - они тогда бы просто напросто не работали. Утверждение "кэши когерентны" не верно - они могут временно разъезжаться. Правильнее всего сказать - "кэши eventually когерентны". Извиняюсь, не знаю более подходящего слова на русском. То есть они "когерентны со временем". Теперь по ссылкам. 1. Идем в Гугл: https://www.google.ru/?q=intel developer manual 2. Оттуда на сайт Интела: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html 3. Жмем Ctrl-F, ищем по слову "memory". 4. Понимаем, что был некий вайтпапир про память, который смержили в главу 3A, открываем ее: http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf 5. Пробегаемся по оглавлению, замечаем главу 8.2 Memory Ordering, идем в нее. 6. Тут уж почитаете, что вам интересно. Например, 8.2.3.4 - это пример, который я приводил выше. А 8.2.3.5 - это ответ на ваш вопрос , как раз показывает, что когерентность может нарушаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 21:39 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruЕвгенийВcodearticles.ru, Делай что нибудь полезное, а не жди. Ты признаёшь, что опростоволосился? Ответь, будь мужчиной. а ты все же попробуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 22:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Не флеима ради. Опять вникал в тему и два источника противоречат друг другу. вот интересно кто прав. The C# memory model permits reordering of memory operations in a method, as long as the behavior of single-threaded execution doesn’t change. For example, the compiler and the processor are free to reorder the Init method operations as follows: Strong Model 2: .NET Framework 2.0: ... 4.Writes cannot move past other writes from the same thread. Кто знает правилный ответ в терминах "C# memory model"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:02 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron , Первая ссылка правильная. Вторая ссылка тоже была правильной ... в то время, когда публиковалась :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:14 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv mikron , Первая ссылка правильная. Вторая ссылка тоже была правильной ... в то время, когда публиковалась :-) А мне первая не нравится своим заголовком: "C# Memory Model According to ECMA-334". В терминах етой модели он прав, но во втором посте автор опятъ ссылается на предидушее заявление, но уже с CLR 4.5. К тому-же преведённый тобой документ тоже подтвержадет "Writes cannot move past other writes from the same thread." "8.2.2 Memory Ordering in P6 and More Recent Processor Families" -- Writes to memory are not reordered with other writes, with the following ... -- Writes by a single processor are observed in the same order by all processors. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:30 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronК тому-же преведённый тобой документ тоже подтвержадет "Writes cannot move past other writes from the same thread." "8.2.2 Memory Ordering in P6 and More Recent Processor Families" -- Writes to memory are not reordered with other writes, with the following ... -- Writes by a single processor are observed in the same order by all processors.Ну все верно, именно так x86 и работают (см. total store order). Но в чем вопрос ваш заключается? Да, сторы не могут "заезжать" друг за друга на одном процессоре. Но это не гарантирует когерентности кэшей, что как раз и проиллюстрировано в примерах из спецификации Intel-овских процессоров, которые я вам приводил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:36 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
И вот человек говорит странное As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword — so this keyword has no effect on the hardware if you’re using these processors. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:38 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Давате котлеты от мух отдельно а то скоро мы смешаем смежные и взаимосщязанные но не идентичные темы. первое противоречие в ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:47 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronИ вот человек говорит странное As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword — so this keyword has no effect on the hardware if you’re using these processors. Нет, это неверно. На самом деле, ситуация следующая. Давайте определим 4 типа "фенсов": LoadLoad, LoadStore, StoreLoad, StoreStore. Например, "LoadStore" означает, что последующе сторы не могут быть поставлены до лоада, защищенного этим фенсом: Код: c# 1. 2. 3. Семантика volatile выглядит вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но проблема в том, что в таком варианте int y0 = y может "заехать" за x = 1 в одном потоке, что приведет к вот этому: 16627718 Поэтому на самом деле волатильный стор выглядит вот так: Код: c# 1. 2. 3. 4. На x86 фенсы StoreStore, LoadLoad и LoadStore уже гарантированы архитектурой. А StoreLoad не гарантирован! Поэтому его имплементируют руками, например через "lock add(esp, 0)" или через какие-нибудь mfence. Вывод: volatile работает не так, как обычные переменные даже на x86. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:53 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvmikronИ вот человек говорит странное As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword — so this keyword has no effect on the hardware if you’re using these processors. Семантика volatile выглядит вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. Но проблема в том, что в таком варианте int y0 = y может "заехать" за x = 1 в одном потоке, что приведет к вот этому: 16627718 Вывод: volatile работает не так, как обычные переменные даже на x86. Мне сложно следовать ващим мыслям. 1. Я непонимаю каким образом ваши утверждения о волатиле сторе имеют отношения к утверждению "As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword". Автор говорит об общем случае (volatile or not it doesn't matter) а вы скатываетесь к часному (volatile). 2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере для y0 есть сторе и значит по утвержденю автора acquire-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая. 3. Вывод мне ещё боле непонатен. Спецификация говорит что волатзиле работает по другому. Этому не нужно доказательств, зачем вы делаете вывод для аксиомы? Поясните. 4. И как вы считаете, какой ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:04 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron"As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword". Автор говорит об общем случае (volatile or not it doesn't matter) а вы скатываетесь к часному (volatile).Вы фразу то целиком пишите. У нее там еще окончание есть, которое вы же и привели: "... so this keyword has no effect on the hardware if you’re using these processors." Я вам и говорю - это неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:22 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере для y0 есть сторе и значит по утвержденю автора acquire-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая.Стора здесь нет. Вернее, может не быть: процессор может сохранить y0 в регистр, и работать там. int y0 = y - это LOAD, а не STORE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере для y0 есть сторе и значит по утвержденю автора acquire-fences и release-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron4. И как вы считаете, какой ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model"Не знаю. И не знаю, зачем мне это нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:25 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvmikron"As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword". Автор говорит об общем случае (volatile or not it doesn't matter) а вы скатываетесь к часному (volatile).Вы фразу то целиком пишите. У нее там еще окончание есть, которое вы же и привели: "... so this keyword has no effect on the hardware if you’re using these processors." Я вам и говорю - это неверно. Ну тогда уже полноты ради. "However, volatile does have an effect on optimizations performed by the compiler and the CLR — as well as on 64-bit AMD and (to a greater extent) Itanium processors.". Вот мы уже и прешли к разнице между архитектурой и оптимизатором CLR. Даваите вернёмся к "CLR memory model". и оставим в стороне процессорные кеши и аспекты архитектуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=20&tid=1402419]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
165ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
155ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 372ms |

| 0 / 0 |
