powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций
25 сообщений из 145, страница 1 из 6
Потокобезопасное использование потоконебезопасных коллекций
    #38756991
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем, Queue. В одном потоке делаю Enqueue, а в другом периодически проверяю свойство Count - не меньше ли оно какого-то значения - и делаю Dequeue. Не обязательно же в таком сценарии использовать потокобезопасную очередь?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38756995
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду без блокировок и прочего. Чисто логикой использования обеспечить потокобезопасность.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38756997
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моём случае получается, что даже исключение о пустой очереди при использовании Dequeue не будет кидаться, т. к. Count может только увеличиться или остаться неизменным, а я всё время проверяю этот Count.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757008
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42 ,
Нет, так использоваться нельзя. Почитайте про volatile .
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #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
Потокобезопасное использование потоконебезопасных коллекций
    #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
Потокобезопасное использование потоконебезопасных коллекций
    #38757071
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНесинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы
А подумать? Да, при опросе может быть 0, и при этом в очереди быть элементы, но обычно опрос периодический. И на следующей итерации точно будут считаны все элементы в очереди. Так что советую вам не увлекаться volatile
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757084
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обезопасить получения числа можно через статический враппер Synchronized, если уж тут не идет разговор о работе с перечислениями
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757101
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79cdtyjvНесинхронизированный доступ к queue.Count может вам вернуть 0, когда там на самом есть элементы
А подумать? Да, при опросе может быть 0, и при этом в очереди быть элементы, но обычно опрос периодический. И на следующей итерации точно будут считаны все элементы в очереди. Так что советую вам не увлекаться volatileА кто вам дал гарантию, что на следующей итерации вы увидите новое значение? Сами выдумали? Про модели памяти что-нибудь слышали? Какие гарантии на чтение дает Java/.Net знаете? Если нет, то расскажу - эти платформы гарантируют, что при обычном чтении переменной вы увидите одно из значений записанных в нее ранее (это отбрасывает out-of-thin-air значения). Нет никаких гарантий, что вы когда-либо увидите самое последнее значение. Погуглите про классический пример, когда один поток в цикле читает булевский флажок, другой поток меняет его на обратный, а первый так и продолжает кружиться в бесконечнои цикле. Это прекрасно вопсроизводится и в Java, и в .Net. И как вы тогда будете писать код под такой сценарий? Или же напишете в коде комментарий, что с вашей оберткой нельзя работать в while() цикле? Курам на смех такие решения. Есть модель памяти, есть правила работы многопоточных приложений, нормальные программисты им следуют.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757143
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvИ как вы тогда будете писать код под такой сценарий? Или же напишете в коде комментарий, что с вашей оберткой нельзя работать в while() цикле? Курам на смех такие решения. Есть модель памяти, есть правила работы многопоточных приложений, нормальные программисты им следуют.

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

А хренею, конечно. Только на SQL.ru я встречаю "специалистов", которые могут с пеной у рта отстаивать некорректный говнокод, игнорируя все мыслимые и немыслимые рекомендации MSDN-ов.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757184
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном, ну дак иди отсюда, не трать в пустую своё драгоценное время. У тебя ещё дом не построен и курсы не готовы.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757196
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
Мне некуда идти, я поднимаю с колен индустрию программирования в России.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757200
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
А, стоп. То есть вы тоже такой код пишете? А ваши chief apricot'ы знают об этом? Или же вы все таки считаете неприемлемым писать некорректный код, игнорирующий модель памяти?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757206
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
Мне некуда идти, я поднимаю с колен индустрию программирования в России.Каким образом? Троллением на SQL.ru?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757209
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
А, стоп. То есть вы тоже такой код пишете? А ваши chief apricot'ы знают об этом? Или же вы все таки считаете неприемлемым писать некорректный код, игнорирующий модель памяти?Толсто, Свеном.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757215
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну а что будет если читать количество без блокировки?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #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
Потокобезопасное использование потоконебезопасных коллекций
    #38757230
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvМне, как спецу по многопоточности, очевидно, что этот код некорректен.
Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757234
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи ,
Будет следующее:
- Сегодня вы запустите этот код, и он отработает нормально.
- Потом вы еще несколько лет попишете такой же код, и он тоже будет работать.
- А потом он сломается. Либо после апдейта .Net, либо после того, как ваш коллега поменяет две независимые строчки местами, либо просто после того, как ваш сервер переедет на новое железо, либо просто после того, как звезды неправильно стали на небе.

А всего то надо было понять модель памяти .Net.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757241
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, Свеном, я тебе не про код писал. Перечитай.
Переходы на личности в виде "специалистов, которые могут с пеной у рта", поднимание с колен, упоминание chief apricot'ов, - всё это к теме топика и предлагаемым автору подходам не относится, а является простым троллингом.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757252
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Вас не затруднит на тестовом примере (программку) показать, где именно такой код обрушится? Вам, как эксперту в трех языках, такое должно быть как два пальца...В том то и дело, что затруднит! В это и заключается сложность многопоточной разработки - вы можете годами считать, что у вас все нормально, хотя на самом деле ходите по краю пропасти. Я с вероятностью 99% не смогу написать тест, который сломает ваш код. Он будет работать. Но код при этом некорректен. И эти два утверждения не противоречат друг другу.
Когда я рассказываю людям про многопоточность в Java, я им показываю два сценария, в которых неследование модели памяти ломает код - один с while-циклом, про который я говорил выше, а другой c final (неким аналогом readonly в Net). И я им показываю сгенерированный ассемблерный код с пояснением, что именно сломалось. Так знаете в чем комичность этой ситуации? В том, что эти мои два сценария могут запросто ... начать нормально работать при апдейте JVM, при переезде на новый компьютер, и т.д..
Суть проблемы заключается в том, что если вы следуете модели памяти, то ваш код будет работать всегда. Если вы ей не следуете, то его работоспособность начинает зависеть уже не от вас, а от разработчиков процессоров и разработчиков .Net.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757258
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,
в среднестатическом исполнении
очередь чистится с одного конца ( в одном месте)
Код: c#
1.
2.
3.
4.
5.
6.
7.
 if ( 0 != queue.Count )
{
// вдруг там другой поток добавил что то..
    var msq = queue.Dequeue();
}
ну добавил, при следующей итерации вычистится, в чем проблема, будем  считать это маленьким парадоксом Шредингера.
хотите  более  партикул садите блокировку а тут в чем проблема, мы ж не знаем всей задачи, для для джуниора хватит и этого
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #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
Потокобезопасное использование потоконебезопасных коллекций
    #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
25 сообщений из 145, страница 1 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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