Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций / 25 сообщений из 145, страница 1 из 6
25.09.2014, 09:18
    #38756991
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Скажем, Queue. В одном потоке делаю Enqueue, а в другом периодически проверяю свойство Count - не меньше ли оно какого-то значения - и делаю Dequeue. Не обязательно же в таком сценарии использовать потокобезопасную очередь?
...
Рейтинг: 0 / 0
25.09.2014, 09:18
    #38756995
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Я имею ввиду без блокировок и прочего. Чисто логикой использования обеспечить потокобезопасность.
...
Рейтинг: 0 / 0
25.09.2014, 09:20
    #38756997
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
В моём случае получается, что даже исключение о пустой очереди при использовании Dequeue не будет кидаться, т. к. Count может только увеличиться или остаться неизменным, а я всё время проверяю этот Count.
...
Рейтинг: 0 / 0
25.09.2014, 09:29
    #38757008
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
НемоКэп42 ,
Нет, так использоваться нельзя. Почитайте про volatile .
...
Рейтинг: 0 / 0
25.09.2014, 10:11
    #38757058
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
НемоКэп42исключение о пустой очереди при использовании Dequeue не будет кидаться, т. к. Count может только увеличиться или остаться неизменным,
При Dequeue Count вобще то уменьшается

cdtyjvНет, так использоваться нельзя. Почитайте про volatile .
Можно, но с доработками, что то типа:
Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != queue.Count ) {
    lock(queue) {
        if ( 0 != queue.Count )
            var msq = queue.Dequeue();
    }
}



Правда я все равно бы использовал ConcurrentQueue<T>
...
Рейтинг: 0 / 0
25.09.2014, 10:14
    #38757066
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Arm79cdtyjvНет, так использоваться нельзя. Почитайте про volatile .
Можно, но с доработками, что то типа:
Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != queue.Count ) {
    lock(queue) {
        if ( 0 != queue.Count )
            var msq = queue.Dequeue();
    }
}



Во-первых:
НемоКэп42Я имею ввиду без блокировок и прочего. Чисто логикой использования обеспечить потокобезопасность.
Во-вторых: ваш пример вообще некорректен. Несинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы. В итоге, вы продолбаете Dequeue(). Вам тоже надо почитать про volatile .
...
Рейтинг: 0 / 0
25.09.2014, 10:18
    #38757071
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjvНесинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы
А подумать? Да, при опросе может быть 0, и при этом в очереди быть элементы, но обычно опрос периодический. И на следующей итерации точно будут считаны все элементы в очереди. Так что советую вам не увлекаться volatile
...
Рейтинг: 0 / 0
25.09.2014, 10:28
    #38757084
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
обезопасить получения числа можно через статический враппер Synchronized, если уж тут не идет разговор о работе с перечислениями
...
Рейтинг: 0 / 0
25.09.2014, 10:37
    #38757101
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Arm79cdtyjvНесинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы
А подумать? Да, при опросе может быть 0, и при этом в очереди быть элементы, но обычно опрос периодический. И на следующей итерации точно будут считаны все элементы в очереди. Так что советую вам не увлекаться volatileА кто вам дал гарантию, что на следующей итерации вы увидите новое значение? Сами выдумали? Про модели памяти что-нибудь слышали? Какие гарантии на чтение дает Java/.Net знаете? Если нет, то расскажу - эти платформы гарантируют, что при обычном чтении переменной вы увидите одно из значений записанных в нее ранее (это отбрасывает out-of-thin-air значения). Нет никаких гарантий, что вы когда-либо увидите самое последнее значение. Погуглите про классический пример, когда один поток в цикле читает булевский флажок, другой поток меняет его на обратный, а первый так и продолжает кружиться в бесконечнои цикле. Это прекрасно вопсроизводится и в Java, и в .Net. И как вы тогда будете писать код под такой сценарий? Или же напишете в коде комментарий, что с вашей оберткой нельзя работать в while() цикле? Курам на смех такие решения. Есть модель памяти, есть правила работы многопоточных приложений, нормальные программисты им следуют.
...
Рейтинг: 0 / 0
25.09.2014, 10:56
    #38757143
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjvИ как вы тогда будете писать код под такой сценарий? Или же напишете в коде комментарий, что с вашей оберткой нельзя работать в while() цикле? Курам на смех такие решения. Есть модель памяти, есть правила работы многопоточных приложений, нормальные программисты им следуют.

Ну вот не знаю как. Столько лет пишу, и ни разу не было зацикливание. Всегда все было прекрасно. И тут пришел свеном и популярно объяснил, что я не прав. Странно, да?
...
Рейтинг: 0 / 0
25.09.2014, 11:16
    #38757171
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Arm79Ну вот не знаю как. Столько лет пишу, и ни разу не было зацикливание. Всегда все было прекрасно. И тут пришел свеном и популярно объяснил, что я не прав. Странно, да?Ну да, столько написали некорректный говнокод, который может бомбануть в любую минуту по независящим от вас причинам (например, потому что разработчики из Microsoft внесли какое-нибудь изменение в register allocator своего JIT-компилятора, из-за чего не-волатильное значение конкретно в вашем сценарии стало более агрессивно кэшироваться в регистре процессора).

А хренею, конечно. Только на SQL.ru я встречаю "специалистов", которые могут с пеной у рта отстаивать некорректный говнокод, игнорируя все мыслимые и немыслимые рекомендации MSDN-ов.
...
Рейтинг: 0 / 0
25.09.2014, 11:28
    #38757184
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Свеном, ну дак иди отсюда, не трать в пустую своё драгоценное время. У тебя ещё дом не построен и курсы не готовы.
...
Рейтинг: 0 / 0
25.09.2014, 11:33
    #38757196
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
skyANA ,
Мне некуда идти, я поднимаю с колен индустрию программирования в России.
...
Рейтинг: 0 / 0
25.09.2014, 11:34
    #38757200
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
skyANA ,
А, стоп. То есть вы тоже такой код пишете? А ваши chief apricot'ы знают об этом? Или же вы все таки считаете неприемлемым писать некорректный код, игнорирующий модель памяти?
...
Рейтинг: 0 / 0
25.09.2014, 11:37
    #38757206
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjv skyANA ,
Мне некуда идти, я поднимаю с колен индустрию программирования в России.Каким образом? Троллением на SQL.ru?
...
Рейтинг: 0 / 0
25.09.2014, 11:37
    #38757209
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjv skyANA ,
А, стоп. То есть вы тоже такой код пишете? А ваши chief apricot'ы знают об этом? Или же вы все таки считаете неприемлемым писать некорректный код, игнорирующий модель памяти?Толсто, Свеном.
...
Рейтинг: 0 / 0
25.09.2014, 11:39
    #38757215
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
ну а что будет если читать количество без блокировки?
...
Рейтинг: 0 / 0
25.09.2014, 11:42
    #38757221
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
skyANA ,
Да я просто пытаюсь понять, по какой причине вы обвиняете меня в троллинге. Вот наш коллега предложил код:
Arm79Можно, но с доработками, что то типа:
Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != queue.Count ) {
    lock(queue) {
        if ( 0 != queue.Count )
            var msq = queue.Dequeue();
    }
}

Мне, как спецу по многопоточности, очевидно, что этот код некорректен. Разумеется, я об этом так и говорю - код некорректен. Тут приходите вы, и говорите про какой-то троллинг. В чем он заключается? Потому я и пытаюсь понять - либо вы не видите в этом коде ошибки, либо же вы считаете, что указывать на чужие ошибки это троллинг, либо что-то третье.
...
Рейтинг: 0 / 0
25.09.2014, 11:45
    #38757230
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjvМне, как спецу по многопоточности, очевидно, что этот код некорректен.
Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...
...
Рейтинг: 0 / 0
25.09.2014, 11:46
    #38757234
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Где-то в степи ,
Будет следующее:
- Сегодня вы запустите этот код, и он отработает нормально.
- Потом вы еще несколько лет попишете такой же код, и он тоже будет работать.
- А потом он сломается. Либо после апдейта .Net, либо после того, как ваш коллега поменяет две независимые строчки местами, либо просто после того, как ваш сервер переедет на новое железо, либо просто после того, как звезды неправильно стали на небе.

А всего то надо было понять модель памяти .Net.
...
Рейтинг: 0 / 0
25.09.2014, 11:51
    #38757241
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Вообще-то, Свеном, я тебе не про код писал. Перечитай.
Переходы на личности в виде "специалистов, которые могут с пеной у рта", поднимание с колен, упоминание chief apricot'ов, - всё это к теме топика и предлагаемым автору подходам не относится, а является простым троллингом.
...
Рейтинг: 0 / 0
25.09.2014, 11:55
    #38757252
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
Arm79Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...В том то и дело, что затруднит! В это и заключается сложность многопоточной разработки - вы можете годами считать, что у вас все нормально, хотя на самом деле ходите по краю пропасти. Я с вероятностью 99% не смогу написать тест, который сломает ваш код. Он будет работать. Но код при этом некорректен. И эти два утверждения не противоречат друг другу.
Когда я рассказываю людям про многопоточность в Java, я им показываю два сценария, в которых неследование модели памяти ломает код - один с while-циклом, про который я говорил выше, а другой c final (неким аналогом readonly в Net). И я им показываю сгенерированный ассемблерный код с пояснением, что именно сломалось. Так знаете в чем комичность этой ситуации? В том, что эти мои два сценария могут запросто ... начать нормально работать при апдейте JVM, при переезде на новый компьютер, и т.д..
Суть проблемы заключается в том, что если вы следуете модели памяти, то ваш код будет работать всегда. Если вы ей не следуете, то его работоспособность начинает зависеть уже не от вас, а от разработчиков процессоров и разработчиков .Net.
...
Рейтинг: 0 / 0
25.09.2014, 11:58
    #38757258
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjv,
в среднестатическом исполнении
очередь чистится с одного конца ( в одном месте)
Код: c#
1.
2.
3.
4.
5.
6.
7.
 if ( 0 != queue.Count )
{
// вдруг там другой поток добавил что то..
    var msq = queue.Dequeue();
}
ну добавил, при следующей итерации вычистится, в чем проблема, будем  считать это маленьким парадоксом Шредингера.
хотите  более  партикул садите блокировку а тут в чем проблема, мы ж не знаем всей задачи, для для джуниора хватит и этого
...
Рейтинг: 0 / 0
25.09.2014, 12:01
    #38757267
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
cdtyjvArm79Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...В том то и дело, что затруднит! В это и заключается сложность многопоточной разработки - вы можете годами считать, что у вас все нормально, хотя на самом деле ходите по краю пропасти. Я с вероятностью 99% не смогу написать тест, который сломает ваш код. Он будет работать. Но код при этом некорректен. И эти два утверждения не противоречат друг другу.
Когда я рассказываю людям про многопоточность в Java, я им показываю два сценария, в которых неследование модели памяти ломает код - один с while-циклом, про который я говорил выше, а другой c final (неким аналогом readonly в Net). И я им показываю сгенерированный ассемблерный код с пояснением, что именно сломалось. Так знаете в чем комичность этой ситуации? В том, что эти мои два сценария могут запросто ... начать нормально работать при апдейте JVM, при переезде на новый компьютер, и т.д..
Суть проблемы заключается в том, что если вы следуете модели памяти, то ваш код будет работать всегда. Если вы ей не следуете, то его работоспособность начинает зависеть уже не от вас, а от разработчиков процессоров и разработчиков .Net.

Иными словами, ты теоретизируете. На практике такой код 100% рабочий. Что будет через несколько лет - я не знаю, но проблем не возникло ни на моей рабочей машине (Win XP, количество ядер не помню, Win 7 - 8 ядер, Windows 2003 и Windows 8 - 48 ядер десятки серверов). Через несколько лет и метеорит может ударить. И сервер отключится. На все не заложишься.

Кстати, вы плохо прочитали исходный пост: я сказал, что на практике предпочитаю lock-free модель, и юзаю ConcurrentQueue
...
Рейтинг: 0 / 0
25.09.2014, 12:03
    #38757271
codearticles.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасное использование потоконебезопасных коллекций
НемоКэп42Скажем, Queue. В одном потоке делаю Enqueue, а в другом периодически проверяю свойство Count - не меньше ли оно какого-то значения - и делаю Dequeue. Не обязательно же в таком сценарии использовать потокобезопасную очередь?
Используй ConcurrentQueue и забудь о страхах.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var queue = new ConcurrentQueue<int>(new[] { 1, 2, 3, 4, 5 }); // in
var list = new ConcurrentBag<int>(); // out

Action action = () =>
{
    int i;
    queue.TryDequeue(out i);
    list.Add(i);
};

// 5 потоков, читаем из ConcurrentQueue и пишем в ConcurrentBag
var actions = Enumerable.Range(1, queue.Count).Select(d => action).ToArray();
Parallel.Invoke(actions);
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций / 25 сообщений из 145, страница 1 из 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]