powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций
145 сообщений из 145, показаны все 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
Потокобезопасное использование потоконебезопасных коллекций
    #38757278
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Иными словами, ты теоретизируете. На практике такой код 100% рабочий.Это не я теоретизирую. Это MSDN просит вас писать код в соответствии с моделью памяти. Если вы считаете, что забивать на советы разработчиков платформы - ваше право. Писать говнокод - ваше право. Но пожалуйста - не надо советовать писать говнокод другим людям .
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757291
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном, так дай ТСу пример хорошего кода, решающего его проблему. Ну или ссылку на почитать.
Пока твои выпады выглядят толсто и бессмысленно.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757300
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
Что ему советовать? Он итак прекрасно знает, что надо использовать Concurrent* классы, перечитайте его вопрос. Вопрос был в том, можно ли как-то расслабить это в его сценарии. Ответ простой - нет, нельзя.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757306
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
Что ему советовать?Ссылку на почитать.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757309
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAСсылку на почитать.Может быть еще и прочитать за него? У меня такое ощущение, что вам лишь бы что-то сказать, но что бы это было сказано последним.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757311
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvто ему советовать? Он итак прекрасно знает, что надо использовать Concurrent* классы, перечитайте его вопрос. Вопрос был в том, можно ли как-то расслабить это в его сценарии. Ответ простой - нет, нельзя.
Как нельзя? Зачем же вы советовали volatile? Неужто эксперт дал бессмысленный совет? Или не в состоянии привести с ним корректный пример?

Расскажите, как эксперт, поможет ли применение барьеров памяти в моем коде?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757313
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvУ меня такое ощущение, что вам лишь бы что-то сказать
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757319
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79cdtyjvто ему советовать? Он итак прекрасно знает, что надо использовать Concurrent* классы, перечитайте его вопрос. Вопрос был в том, можно ли как-то расслабить это в его сценарии. Ответ простой - нет, нельзя.
Как нельзя? Зачем же вы советовали volatile? Неужто эксперт дал бессмысленный совет? Или не в состоянии привести с ним корректный пример?

Расскажите, как эксперт, поможет ли применение барьеров памяти в моем коде?
я думаю есть смысл сделать свою обертку на queue, где будет синхронизирован доступ и всякие Count как раз volitale. Хотя значение этого слова свеном явно преувеличивает. Кстати такая обретка у меня где-то была. В те далекие Net 2.0 ей пользовался)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757320
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANAСсылку на почитать.Может быть еще и прочитать за него? У меня такое ощущение, что вам лишь бы что-то сказать, но что бы это было сказано последним.Нет читать он сам будет.
В сухом остатке, что ты написал: volatile, MSDN.
Ну воспользуется ТС поиском в MSDN, ну получит "Results 1-20 of about 79,900 for: volatile c#". Забьёт.

P.S.: я в отпуске, раскладываю вещи после возвращения из Крыма и стирки.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757321
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот нашел. файл прикладываю. там даже все по науке. Свеному понравится
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757329
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanвот нашел. файл прикладываю. там даже все по науке. Свеному понравится

http://www.sql.ru/forum/actualfile.aspx?id=16620467] Приложенный файл (NewQueue.cs - 5Kb)
Ну это не обёртка, а свой класс :-) Выбивается за рамки топика. Вопрос то был про обычную Queue

Может, имело смысл унаследоваться от Queue, переопределить свойство через new, а бакэнд поле сделать volatile? Пока иных применений этому слову я не вижу.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38757335
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79netivanвот нашел. файл прикладываю. там даже все по науке. Свеному понравится

http://www.sql.ru/forum/actualfile.aspx?id=16620467] Приложенный файл (NewQueue.cs - 5Kb)
Ну это не обёртка, а свой класс :-) Выбивается за рамки топика. Вопрос то был про обычную Queue

Может, имело смысл унаследоваться от Queue, переопределить свойство через new, а бакэнд поле сделать volatile? Пока иных применений этому слову я не вижу.
ну да. я просто забыл даже как там было сделано :) Но помойму проще всего в "лоб" lock(sync) на все операции. Откровенно говоря "тормоза" от этого вряд ли будут заметны
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758174
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А эти Concurrent не сильно много производительности и потребления памяти используют, по сравнению с не Concurrent?

У меня не библиотека и не какой-то код, от которого кто-то наследоваться будет. У меня однозначно в одном потоке добавляются данные в очередь, а в другом - берутся из неё.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758175
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42А эти Concurrent не сильно много производительности и потребления памяти используют, по сравнению с не Concurrent?
Они там вообще как построены? Может, на банальных lock'ах?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758176
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42НемоКэп42А эти Concurrent не сильно много производительности и потребления памяти используют, по сравнению с не Concurrent?
Они там вообще как построены? Может, на банальных lock'ах?Возьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает.
Мы же не знаем где и как Вы у себя очереди используете.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758184
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВозьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает.
Мы же не знаем где и как Вы у себя очереди используете.Какой еще JustDecompile? Во-первых, если уж брать дизассемблер, то ILSpy, а не эту фигню. Во-вторых, что бы посмотреть исходники mscorlib, достаточно просто открыть Гугл, и вбить там ".net reference source".
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758223
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANAВозьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает.
Мы же не знаем где и как Вы у себя очереди используете.Какой еще JustDecompile? Во-первых, если уж брать дизассемблер, то ILSpy, а не эту фигню. Во-вторых, что бы посмотреть исходники mscorlib, достаточно просто открыть Гугл, и вбить там ".net reference source".

У меня решарпер открывает исходники. По возможности, качает, если нет - декомпилирует
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758237
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanвот нашел. файл прикладываю. там даже все по науке. Свеному понравится
Посмотрел код.
1. Непонял зачем выкрутасы в Enqueue
Код: c#
1.
2.
3.
oldTail = _tail; 
oldTailNext = oldTail.Next; 
if (_tail == oldTail)  // Optimisation can remove comparission


2. Непонял зачем страдания в TryDequeue. Достаточно уменьшить _count.
3. проблемы с памятью. добавь и удали один елемент. остаётся живая ссылка.
4. сильно не проверял но т.к. _tail может содержать ссылку не на последний елемент списка, то вся конструкция вызывает сомнения.

Ну а в обшем пример показательный. чаше проще lock-ат обект чем написать беошибочный код.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758267
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,
по первому, в код не вникал, но наверное проверка что не залез кто то из другого потока,
по остальному, при беглом взгляде в сети данный код используется в около сотни проектах, наверное можно его считать верифицированным ( условно)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758381
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan ,
Ага, настолько по науке, что на любой Enqueue делается минимум по два CAS-а, есть дополнительный cmpxchg и race condition на никому не нужном _count, а Clear() не потокобезопасен. Мрак.
Смотрите в Java, класс ConcurrentLinkedQueue - именно так должна выглядеть эффективная потокобезопасная очередь.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758384
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО !
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758490
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv netivan ,
Ага, настолько по науке, что на любой Enqueue делается минимум по два CAS-а, есть дополнительный cmpxchg и race condition на никому не нужном _count, а Clear() не потокобезопасен. Мрак.
Смотрите в Java, класс ConcurrentLinkedQueue - именно так должна выглядеть эффективная потокобезопасная очередь.
какой-то ты набор слов написал непонятный. Мне срать что там в яве, человек просил кастомный класс ему скинул.
авторХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО! напиши идеальный, оценим
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758495
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANAВозьмите JustDecompile, да посмотрите. Память Вам тоже никто замерить не запрещает.
Мы же не знаем где и как Вы у себя очереди используете.Какой еще JustDecompile? Во-первых, если уж брать дизассемблер, то ILSpy, а не эту фигню. Во-вторых, что бы посмотреть исходники mscorlib, достаточно просто открыть Гугл, и вбить там ".net reference source".Свеном, я посоветовал новичку, что по проще. У тебя какие-то проблемы?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758499
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО !

Критиковать каждый горазд, особенно старый код под .net2. Мы ждем вашего кода. С volatile в пределах заданного ТС коридора.

Кстати, товарищ эксперт, если мой код исправить так, вас это устроит?

Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != Thread.VolatileRead(queue.Count) ) {
    lock(queue) {
        if ( 0 != Thread.VolatileRead(queue.Count) )
            var msq = queue.Dequeue();
    }
}



Зачем нам смотреть в Java, когда есть ConcurrentQueue и его исходники? Чем он так плох?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758500
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

и еще для тупых и слепых:
Код: c#
1.
2.
3.
4.
 public int Count
    {
        get { return Thread.VolatileRead(ref _count); }
    }


авторСвеном, я посоветовал новичку, что по проще. У тебя какие-то проблемы?
да чего с него взять? Он наверное в блокноте пишет, он же гуру. и компилит все в мозгу своем.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758501
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79cdtyjvХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО !

Критиковать каждый горазд, особенно старый код под .net2. Мы ждем вашего кода. С volatile в пределах заданного ТС коридора.

Кстати, товарищ эксперт, если мой код исправить так, вас это устроит?

Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != Thread.VolatileRead(queue.Count) ) {
    lock(queue) {
        if ( 0 != Thread.VolatileRead(queue.Count) )
            var msq = queue.Dequeue();
    }
}



Зачем нам смотреть в Java, когда есть ConcurrentQueue и его исходники? Чем он так плох?
он еще его не завизировал, вот чем плох он!
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758502
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanавторХахаха, так у вас еще и члены класса не волатильные. То есть вообще никаких гарантий в многопоточно окружении у вас нет. Вердикт - на помойку, СРОЧНО! напиши идеальный, оценимОн только по чужим исходникам на Java способен код на C# писать. И у него это плохо получается.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758516
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиmikron,
по первому, в код не вникал, но наверное проверка что не залез кто то из другого потока,

Вот я и спрашиваю, как эта "проверка" работает? что удержит оптимизатор от её полного удаления за ненужностю?
Оптимизатор может зделать и так.
Код: c#
1.
2.
3.
4.
5.
oldTail = _tail; 
if (_tail == oldTail) {
 oldTailNext = oldTail.Next; 
 ...
}


Тогда очевидно, что она безполезна.

Где-то в степипри беглом взгляде в сети данный код используется в около сотни проектах, наверное можно его считать верифицированным ( условно)

Вот она чудотворящая сила копипасты. Иммено так количество переходит в качество. Ещё одно подверждение марксистко ленинской диалектической теории :))
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758545
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron[src c#]
oldTail = _tail;
oldTailNext = oldTail.Next;
if (_tail == oldTail) // Optimisation can remove comparission

Откуда это?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758549
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот , хороший пост Эрика.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758550
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВmikron[src c#]
oldTail = _tail;
oldTailNext = oldTail.Next;
if (_tail == oldTail) // Optimisation can remove comparission

Откуда это?
16620467
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758597
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanнапиши идеальный, оценимЗачем мне писать свой, если уже все написано? Причем написано эффективно и корректно, в отличие от вашей реализации?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758603
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Кстати, товарищ эксперт, если мой код исправить так, вас это устроит?

Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != Thread.VolatileRead(queue.Count) ) {
    lock(queue) {
        if ( 0 != Thread.VolatileRead(queue.Count) )
            var msq = queue.Dequeue();
    }
}

В вашем коде есть три ошибки:
1) Он не компилируется, так как в VolatileRead надо отдавать адрес переменной, а вы туда отдаете свойство, чего делать нальзя.
2) Нужен lock(queue) и в другом треде, который делает Enqueue(). Вы про это не упомянули, а значит и не подумали.
3) Если бы Thread.VolatileRead(queue.Count) все таки работал, то он не нужен был бы внутри lock(queue), хватило бы и обычного чтения.

Двойка вам.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758608
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronГде-то в степиmikron,
по первому, в код не вникал, но наверное проверка что не залез кто то из другого потока,

Вот я и спрашиваю, как эта "проверка" работает? что удержит оптимизатор от её полного удаления за ненужностю?Да ничего. Поля не волатильны, оптимайзер волен делать, что захочет. Но вот Arm79 считает, что это казуистика, и такой код всегда работает, а модель памяти придумали ботаны-теоретики.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758624
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ Вот , хороший пост Эрика.
Бесполезное гонево ламера, причем 5-летней давности. Откровенный бред человека, который в самом начале признается в своей некомпетентности. Я бы не стал "козырять" такими позорными темами.

P.S. Возможно сейчас у этого веб евангелиста мнение поменялось.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758639
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvArm79Кстати, товарищ эксперт, если мой код исправить так, вас это устроит?

Код: c#
1.
2.
3.
4.
5.
6.
if ( 0 != Thread.VolatileRead(queue.Count) ) {
    lock(queue) {
        if ( 0 != Thread.VolatileRead(queue.Count) )
            var msq = queue.Dequeue();
    }
}


В вашем коде есть три ошибки:
1) Он не компилируется, так как в VolatileRead надо отдавать адрес переменной, а вы туда отдаете свойство, чего делать нальзя.
2) Нужен lock(queue) и в другом треде, который делает Enqueue(). Вы про это не упомянули, а значит и не подумали.
3) Если бы Thread.VolatileRead(queue.Count) все таки работал, то он не нужен был бы внутри lock(queue), хватило бы и обычного чтения.

Двойка вам.

Пичалька. Я действительно не проверял код, но касаемо 3 пункта вы неправы. Если lock объекта отнюдь не означает, что синхронизируются по всех процессорных кэшах значение всех его полей.

Пункт 2 - это лишь ваши фантазии, о чем я там думал.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758645
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79о касаемо 3 пункта вы неправы. Если lock объекта отнюдь не означает, что синхронизируются по всех процессорных кэшах значение всех его полей.Как раз таки означает. Если бы этого не было, то следующий код бы не работал, а он работает:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int x;
int y;
object mux= new object();

// Thread 1:
lock (mux)  
{
    x = 1;
    y = 1;
}

// Thread 2:
lock (mux) 
{
    if (x == 1)
        Debug.Assert(y == 1);
}


Все, я заканчиваю с вами диалог. Разберитесь сначала с моделью памяти, потом поговорим.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758647
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruЕвгенийВ Вот , хороший пост Эрика.
Бесполезное гонево ламера, причем 5-летней давности. Откровенный бред человека, который в самом начале признается в своей некомпетентности. Я бы не стал "козырять" такими позорными темами.

P.S. Возможно сейчас у этого веб евангелиста мнение поменялось.
МСУ, Гайдар в принципе на такие статьи не способен, это перевод блога Эрика Липперта , который не самый последний стековерфлоу и который много лет делал .NET и С#, всякие там деревья выражений, женерики и прочие контрвариантности и чем там ты еще там пользуешься, его рук дело.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758673
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79lock объекта отнюдь не означает, что синхронизируются по всех процессорных кэшах значение всех его полей
cdtyjvКак раз таки означает
Да, действительно, тут я дал маху.

cdtyjvНо вот Arm79 считает, что это казуистика, и такой код всегда работает
Но тут я по прежнему на своем стою - тот код, который я привел, рабочий. Тот, а не такой. Разница есть.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758684
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Но тут я по прежнему на своем стою - тот код, который я привел, рабочий. Тот, а не такой. Разница есть.Да ради бога. Разнесут вас на очередном собеседовании за такой код - может быть начнете по-другому смотреть на вещи.
Код бывает либо корректный, либо нет. Ваш код некорректен, точно так же, как и код нашего коллеги, реализовавшего нерабочую конкурентную очередь. Никаких "конкретно мой" здесь нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758700
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvн

Еще раз:

1 итерация: Читающий поток смотрит на количество. Видит 0, не исполняется ничего
2 итерация: читающий поток видит количество 2 (хотя допустим, пишущие потоки закинули туда 10 объектов, и Count не синхронизирован). Входит lock, где Count уже засинхронизирован и там уже 10, то есть Count корректен. Обрабатывает эти 10 элементов.

Фактически ваша претензия сводится к тому, что объекты в очереди будут обработаны в разных итерациях, что при периодическом опросе несущественно.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758707
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79 ,
Вовсе нет. Моя претензия заключается в том, что если один поток положил элемент в очередь и изменил _count с 0 на 1, то второй поток может продолжать видеть 0 неограниченно долго .
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758709
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВМСУ, Гайдар в принципе на такие статьи не способен, это перевод блога Эрика Липперта

Да, я верю, что он тру кодер, но после таких слов

...За всю мою карьеру, необходимость написать код, который запускает второй рабочий поток, возникала, вероятно, менее полудюжины раз.

вникать в его поток воображения стало лень.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758732
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru...За всю мою карьеру, необходимость написать код, который запускает второй рабочий поток, возникала, вероятно, менее полудюжины раз. вникать в его поток воображения стало лень.Все правильно он написал. Так как преимущественно используют тред-пулы.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758734
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv Arm79 ,
Вовсе нет. Моя претензия заключается в том, что если один поток положил элемент в очередь и изменил _count с 0 на 1, то второй поток может продолжать видеть 0 неограниченно долго .
Но ведь видит же? Может, потому, что при записи в эту очередь тоже lock и там обновляются значения Count?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758741
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Но ведь видит же? Может, потому, что при записи в эту очередь тоже lock и там обновляются значения Count?Нет гарантий, что чтение переменной вне лока увидит изменение, которое внес другой поток внутри лока. Что бы его увидеть нужен барьер памяти до чтения, которого в вашем случае нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758749
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvArm79Но ведь видит же? Может, потому, что при записи в эту очередь тоже lock и там обновляются значения Count?Нет гарантий, что чтение переменной вне лока увидит изменение, которое внес другой поток внутри лока. Что бы его увидеть нужен барьер памяти до чтения, которого в вашем случае нет.

Так это если разовое. Если речь о периодическом опросе, то проблем не будет, Count будет прекрасно меняться.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758771
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код, компилировал его в 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.
class Program
    {
        static readonly Queue<string> _queue = new Queue<string>();

        static void Main(string[] args)
        {
            (new Thread(() =>
                {
                    while (true)
                    {
                        if (0 < _queue.Count)
                        {
                            lock (_queue)
                            {
                                while (0 != _queue.Count)
                                {
                                    string msg = _queue.Dequeue();
                                    Console.WriteLine(msg);
                                }
                            }
                        }                        
                    }

                }) {IsBackground = true}).Start();
            Thread.Sleep(1000);

            Enumerable.Range(1, 25).ToList().ForEach(i => (new Thread(Handler) {IsBackground = true}).Start(i));

            Console.ReadKey();
        }

        static void Handler(object state)
        {
            while (true)
            {
                lock (_queue)
                    _queue.Enqueue(((int)state).ToString());
                Thread.Sleep(1);
            }
            
        }
    }
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758792
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvВсе правильно он написал. Так как преимущественно используют тред-пулы.
Причем тут это?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758824
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.
            Queue<int> queue = new Queue<int>();

            new Thread(() =>
            {
                Thread.Sleep(1000);

                lock (queue)
                {
                    queue.Enqueue(1);
                }

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");

            }).Start();

            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

            while (true)
            {
                if (queue.Count > 0)
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

                    break;
                }
            }



1) Скомплиировать в Release.
2) Запустить без дебагера.

Еще вопросы будут у вас?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758827
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruПричем тут это?При том, что нет ничего страшного в том, что человек редко запускает потоки руками.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758835
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
            Queue<int> queue = new Queue<int>();

            new Thread(() =>
            {
                Thread.Sleep(1000);

                lock (queue)
                {
                    queue.Enqueue(1);
                }

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");

            }).Start();

            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

            while (true)
            {
                if (queue.Count > 0)
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

                    break;
                }
            }



1) Скомплиировать в Release.
2) Запустить без дебагера.

Еще вопросы будут у вас?Что показать-то хотел?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758839
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvcodearticles.ruПричем тут это?При том, что нет ничего страшного в том, что человек редко запускает потоки руками.
Какую-то чушь ты пишешь. Сначала пишешь про использование тредпулов, потом о редкости запуска потоков руками. Возьмем WPF к примеру. Как ты там собрался использовать многопоточность, не используя вторых и последующих потоков? Или тредпул сам волшебным образом будет всё параллелить? Я, конечно, допускаю твой опус о том, что ты имел ввиду веб приложения, где реквесты параллелит IIS. Но это частность и никакого отношения к теме не имеет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758846
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,
.Net 4.5, Windows 7.1, не останавливается. Как я уже писал выше, спокойно может работать на другой конфигурации.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758849
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru,
А автор, которого вы обосрали, гдето писал, что он приклдной разработчик WPF?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758851
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,
Ну и плюс вы не из консоли запустили.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758856
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruЕвгенийВМСУ, Гайдар в принципе на такие статьи не способен, это перевод блога Эрика Липперта

Да, я верю, что он тру кодер, но после таких слов

...За всю мою карьеру, необходимость написать код, который запускает второй рабочий поток, возникала, вероятно, менее полудюжины раз.

вникать в его поток воображения стало лень.
Есть такие задачи, которые не особо расспараллелишь, например когда для последующего шага нужен результат текущего.
Напиши например "банальный многопоточный" генератор чисел Фиббоначи.
Или там генератор всех возможных программ на C#.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758861
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANA,
Ну и плюс вы не из консоли запустили.Не понял, а из чего?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758866
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANA,
.Net 4.5, Windows 7.1, не останавливается. Как я уже писал выше, спокойно может работать на другой конфигурации.Что-то слабо верится.

.Net 4.5, Windows Server 2008 R2 Enterprise
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758867
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvcodearticles.ru,
А автор, которого вы обосрали, гдето писал, что он приклдной разработчик WPF?
А автор, которого я обосрал, где-то писал, что он прикладной разработчик веб?

Более того, если ты читаешь не жопой, то должен увидеть такое предостережение.

...Предостережение: я не эксперт по многопоточному программированию. На самом деле, я бы даже не стал утверждать, что я в нём компетентен. Так что воспринимайте всё, что я пишу на эту тему, с некоторым скептицизмом.

А это уже первый звоночек по поводу того, а не "обосрать" ли его.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758874
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВЕсть такие задачи, которые не особо расспараллелишь, например когда для последующего шага нужен результат текущего.
Да что ты говоришь http://codearticles.ru/articles/2492

ЕвгенийВНапиши например "банальный многопоточный" генератор чисел Фиббоначи.
http://forgetcode.com/Java/221-Multithreading-For-Prime-and-Fibonacci-numbers-using-pipes

ЕвгенийВИли там генератор всех возможных программ на C#.
А в чем проблема?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758877
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,
Еще раз — релиз поставили, дебагер отключили? Если не умеете, то скомпилируйте экзешник, потом откройте cmd руками, и запустите.
Если все равно раьотает нормально — значит вам повезло. В таком случае вбейте в гугле «.net volatile infinite loop», и почитайте поимеры со стэковерфлоу. После этого ваши сомнения будут развеяны.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758890
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
            Queue<int> queue = new Queue<int>();

            new Thread(() =>
            {
                Thread.Sleep(1000);

                lock (queue)
                {
                    queue.Enqueue(1);
                }

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");

            }).Start();

            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

            while (true)
            {
                if (queue.Count > 0)
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

                    break;
                }
            }




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.
Название ОС:                      Microsoft Windows 7 Корпоративная
Версия ОС:                        6.1.7601 Service Pack 1 сборка 7601
Изготовитель ОС:                  Microsoft Corporation
Параметры ОС:                     Рядовая рабочая станция
Сборка ОС:                        Multiprocessor Free
Дата установки:                   09.10.2012, 12:57:33
Время загрузки системы:           23.09.2014, 12:38:26
Изготовитель системы:             System manufacturer
Модель системы:                   System Product Name
Тип системы:                      x64-based PC
Процессор(ы):                     Число процессоров - 1.
                                  [01]: Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2584 МГц
Версия BIOS:                      American Megatrends Inc. 0407, 22.07.2011
Папка Windows:                    C:\Windows
Системная папка:                  C:\Windows\system32
Устройство загрузки:              \Device\HarddiskVolume1
Язык системы:                     ru;Русский
Язык ввода:                       en-us;Английский (США)
Часовой пояс:                     (UTC+04:00) Волгоград, Москва, Санкт-Петербург

Полный объем физической памяти:   8,104 МБ
Доступная физическая память:      1,403 МБ
Виртуальная память: Макс. размер: 16,207 МБ
Виртуальная память: Доступна:     9,136 МБ
Виртуальная память: Используется: 7,071 МБ
Расположение файла подкачки:      C:\pagefile.sys

Ядер 8.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758892
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANA,
Еще раз — релиз поставили, дебагер отключили? Если не умеете, то скомпилируйте экзешник, потом откройте cmd руками, и запустите.Ахаха. Свеном, ну не льсти ты себе так. Карму испортишь.
cdtyjvЕсли все равно раьотает нормально — значит вам повезло. В таком случае вбейте в гугле «.net volatile infinite loop», и почитайте поимеры со стэковерфлоу. После этого ваши сомнения будут развеяны.Если я сюда скопирую пример из SO, то с тебя будут долго смеяться. Пусть, кому надо, сам в тихаря это сделает, чтобы тебе обидно не было.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758897
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79, надо на самом деле другой код компилировать и запускать. Тот, что Свеном привёл, он сам не тестировал.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758900
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У него небось и студии-то под рукой нет. Такой вот тонкий троллинг.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758912
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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]
Я например не могу, просвети, покажи код?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758926
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, Arm79
Ок, раз вы сами не в состоянии ... открываем архив, я вам там даже сам экзешник оставил.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758928
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA, Arm79
Ок, раз вы сами не в состоянии ... открываем архив, я вам там даже сам экзешник оставил.

http://www.sql.ru/forum/actualfile.aspx?id=16626057] Приложенный файл (VolatileHang.rar - 27Kb)

Не знаю, что там у вас, но и ваш exe у меня работает. На слово поверите или тоже заскриншотить?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758930
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном, как говорится: Обосрался - обтекай!
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758935
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79, да троллит он. Добавил строку
Код: c#
1.
2.
3.
Thread.Sleep(1000);

Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": One second later ...");

И думает, что мы впадём в ступор от четвёртого сообщения в консоли.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758943
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, побаловались, и хватит. Все равно неактуально, ConcurrentQueue наше все.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758949
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Ладно, побаловались, и хватит. Все равно неактуально, ConcurrentQueue наше все.

PS Забыл только добавить, что код у свенома все равно отличается от нужного. Речь шла об объекте и его поле, а свеном пытается показать проблемы с локальной переменной метода. Предлагаю свеному сделать queue полем класса, и снова попробовать свой код
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758955
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Три : см. аттач.

Ну а вы можете продолжать писать потоконебезопасный код в предположении, что это чистая теория, которая не имеет отношения к реальности.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758959
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79PS Забыл только добавить, что код у свенома все равно отличается от нужного. Речь шла об объекте и его поле, а свеном пытается показать проблемы с локальной переменной метода. Предлагаю свеному сделать queue полем класса, и снова попробовать свой кодОкей, вот результаты:
1) Статическая переменная - не виснет.
2) Статический враппер внутри которого лежит очередь - виснет.
3) Создать локальную переменную, которой присвоить статическую переменную - виснет.

И таких экспериментов можно уйму сделать. И как вы потом пользователю или коллеге объясните в каких случаях ваша поделка работает, а в каких нет? А никак, так как код сломан, нет гарантии, что он будет работать.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758962
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВЯ тебе про то, что есть список задач и нельзя выполнить задачу N+1 не зная результата для N и так для всего списка.
Ну если у тебя весь стек задач так устроен, то да. А если 1 задача из 100 задач не зависит ни от чего, то почему бы её не распаралелить?

ЕвгенийВДешевый пиар ресурса. Какой ресурс, такой и пиар :)
Дешевый вброс бреда от ЕвгенийВ. Ничего ресурс винить из-за собственного криворучия :)

ЕвгенийВТы путаешь Божий дар с яичницей! Запустить алгоритм в отдельном потоке - не значит распараллелить его.
Собственно, и наоборот, распараллелить - это не значит использовать отдельный поток. Может быть задействован как и поток из пула, так и асинхронный вызов. Но мы не о том. Какая тебе разница, выполнится ли блок асинхронно или в отдельном треде? Отдай эту работу отдельным механизмам фреймворка. И ты получишь результат.

ЕвгенийВИли там генератор всех возможных программ на C#.
А в чем проблема? [/quot]
Я например не могу, просвети, покажи код?[/quot]
Причем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758965
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Четыре:
Код: 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.
using System;
using System.Collections.Generic;
using System.Threading;

namespace QueueApplication
{
    class Program
    {
        static void Main()
        {
            Queue<int> queue = new Queue<int>();

            new Thread(() =>
            {
                Thread.Sleep(1000);

                lock (queue)
                {
                    queue.Enqueue(1);
                }

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");
                
                Thread.Sleep(1000);

                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": One second later ...");

            }).Start();

            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

            while (true)
            {
                lock (queue)
                {
                    if (queue.Count > 0)
                    {
                        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

                        break;
                    }
                }
            }

            Console.ReadKey();
        }
    }
}
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758975
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
И в чем суть? Вы проверку размера внесли внутрь лока, разумеется все работает в таком случае.
Мы говорим про вот этот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
while (true)
{
    if (queue.Count > 0)
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

        break;
    }
}

Опять написали, не подумав?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758977
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA ,
Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38758991
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruНу если у тебя весь стек задач так устроен, то да.
У Эрика да.

codearticles.ruСобственно, и наоборот, распараллелить - это не значит использовать отдельный поток. Может быть задействован как и поток из пула, так и асинхронный вызов. Но мы не о том. Какая тебе разница, выполнится ли блок асинхронно или в отдельном треде? Отдай эту работу отдельным механизмам фреймворка. И ты получишь результат.
Еще раз повторяю, напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора.

ЕвгенийВПричем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение.
Напиши метод с сигнатурой IEnumerable<string> GetAllProgramms(), который вернет список ВСЕХ возможных программ на C#, в том числе которые были приведены в этом обсуждении, в этом форуме, которые написал ты, которые написали все, кого ты знаешь и т. д. :)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759005
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВcodearticles.ruНу если у тебя весь стек задач так устроен, то да.
У Эрика да.
Откуда знаешь?

ЕвгенийВЕще раз повторяю, напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора.
Ты прямо жжешь с каждым постом.

Сначало было:

ЕвгенийВНапиши например "банальный многопоточный" генератор чисел Фиббоначи.

Дал код на джаве. Теперь ты вбрасываешь:

ЕвгенийВнапиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать все ядра процессора.

А потом будет: напиши алгоритм получения чисел Фибоначи, который при своем вычислении будет использовать свечения луны и силу маха крыльев всех бабочек Земли. Так?

Причем тут процессор? Откуда он взялся? Речь была о малтитрединге и в частности о распараллеливании. Выйди из сумрака.

ЕвгенийВПричем тут могу или не могу? Обрисуй задачу, опиши проблемы. А потом обсудим решение.
Напиши метод с сигнатурой IEnumerable<string> GetAllProgramms(), который вернет список ВСЕХ возможных программ на C#, в том числе которые были приведены в этом обсуждении, в этом форуме, которые написал ты, которые написали все, кого ты знаешь и т. д. :)[/quot]
Ты бредишь? Я вижу, что да.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759008
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)

Так что все у skyANA правильно, через lock.

Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759026
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)Вы уже окончательно запутались. Вы читаете неволатильное поле Queue.count - в этом ваша ошибка. Так как оно неволатильно, ваш код и не работает.

Arm79Так что все у skyANA правильно, через lock.Вот именно, что у него все правильно написано, потмоу и работает. А у вас нет, потому код не работает.

Arm79Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.У вас работает. А на других окружениях нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759051
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, алгоритмическая подготовка - хуже чем плохо :(
codearticles.ruДа что ты говоришь http://codearticles.ru/articles/2492

Кстати, этот код еще подойдет для начального ознакомления с тасками, чего впрочем хватает для того, что бы в простейшем случае отделить рабочий поток от гуя, рисованием которого автор видимо и занимается большую часть времени. Но каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам!

codearticles.ruТы бредишь? Я вижу, что да.
С твоей колокольни - да. С колокольни пишущих компиляторы - нет.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759052
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvArm79Свеном, причем здесь твой код с локальной переменной? Твоя хваленая волатильность работает для полей, а не переменных: Ключевое слово volatile можно применить только к полям класса или структуры. Локальные переменные не могут быть объявлены как volatile (цитата из MSDN)Вы уже окончательно запутались. Вы читаете неволатильное поле Queue.count - в этом ваша ошибка. Так как оно неволатильно, ваш код и не работает.

Arm79Так что все у skyANA правильно, через lock.Вот именно, что у него все правильно написано, потмоу и работает. А у вас нет, потому код не работает.

Arm79Что имеется ввиду под статическим враппером - не знаю, но все работает не только для static полей, но и для остальных тоже.У вас работает. А на других окружениях нет.

Я не понял? :-) Еще раз, если очередь - это поле, неважно, статическое или нет, с ним все прекрасно работает. Собственно, код, который я привел, это иллюстрирует.

Если вы объявляете локальную переменную и с ней занимаетесь ерундой типа замыканий, у вас проблемы.

Далее, вы же говорили, что нужно использовать волатильность? Но почему примеры у вас без неё? Может, потому что локальные переменные и volatile несовместимы?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759071
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВДа уж, алгоритмическая подготовка - хуже чем плохо :(
Не говори. Формулирование требований и внятность изъяснения - в уверенном минусе.

ЕвгенийВКстати, этот код еще подойдет для начального ознакомления с тасками, чего впрочем хватает для того, что бы в простейшем случае отделить рабочий поток от гуя, рисованием которого автор видимо и занимается большую часть времени.
А почему ты считаешь, что отделение рабочего потока от гуя - детская задача? Вот, выше твой афтар даже пишет, что и такого пороха не нюхал. А ты его тут иконой ставишь. Так что не рассказывай мне про детский сад, загляни к себе в карман и найдешь кучу погремушек и даже соску.

ЕвгенийВНо каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам!
Садись, двойка. Количество процессоров тут второстепенно, важнее, сколько потоков на процесс я могу заполучить. Готов тебя разочаровать, 32-битный процесс с дефолтным адресным пространством может создать максимум 2048 потоков. А теперь рассказать про лимиты x64? Если у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. Твои познания в этой области ниже плинтуса.

ЕвгенийВС твоей колокольни - да. С колокольни пишущих компиляторы - нет.
Выдыхай.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759111
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruСадись, двойка. Количество процессоров тут второстепенно, важнее, сколько потоков на процесс я могу заполучить. Готов тебя разочаровать, 32-битный процесс с дефолтным адресным пространством может создать максимум 2048 потоков. А теперь рассказать про лимиты x64? Если у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай. Твои познания в этой области ниже плинтуса.


Запусти у себя хоть столько.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 var pc = Environment.ProcessorCount * 4 + 1;
            Action[] acts = new Action[pc];
            for (int i = 0; i < pc; i++)
            {
                acts[i] = () => 
                {
                    while (true)
                    {
                        Random r = new Random();
                        var d = Math.Sin(r.NextDouble());
                        if (d == 0.0)
                            break;
                    }
                };
            }
            Parallel.Invoke(acts);


Отпишешься, после перезагрузки "резетом".
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759113
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruЕсли у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай.
А объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759125
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzА объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь?
Если выполняются ресурсоёмкие вычисления, то получим сильную конкуренцию между потоками, большие затраты на переключение контекста и как следствие результаты худшие, чем при последовательной обработке.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759132
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВЗапусти у себя хоть столько.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 var pc = Environment.ProcessorCount * 4 + 1;
            Action[] acts = new Action[pc];
            for (int i = 0; i < pc; i++)
            {
                acts[i] = () => 
                {
                    while (true)
                    {
                        Random r = new Random();
                        var d = Math.Sin(r.NextDouble());
                        if (d == 0.0)
                            break;
                    }
                };
            }
            Parallel.Invoke(acts);


Отпишешься, после перезагрузки "резетом".

Запусти это. Отпишись, как получишь количество разных тредов, большее, чем число процессоров

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class Program
{
    static void Main(string[] args)
    {
        var list = new ConcurrentBag<int>();
        var tasks = Enumerable.Range(1, 1000).Select(d => FooAsync(list)).ToArray();
        Task.WaitAll(tasks);

        foreach (var threadId in list.Distinct())
        {
            Console.WriteLine(threadId);
        }

        Console.Read();
    }

    async static Task FooAsync(ConcurrentBag<int> list)
    {
        await Task.Yield();
        list.Add(Thread.CurrentThread.ManagedThreadId);
    }
}
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759135
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zzcodearticles.ruЕсли у тебя несколько десятков, а то и сотен, "блоков" - смело параллель их и ни о чем не думай.
А объясните пожалуйста, в чем смысл такого параллеливания, все равно ведь не удастся повысить производительность больше, чем количество ядер процессора? Или я ошибаюсь?
Это исключительный случай, когда распараллеливание ничем не поможет. Должна быть хоть одна задача, которая не зависит от предыдущих. Тогда имеет смысл параллелить.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759139
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.Скриншот внимательно смотри.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759146
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ, и да, объяснять разницу, между логическими и физическими процессорами?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759151
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это так, к слову.

Код: c#
1.
2.
3.
var item = new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get().OfType<ManagementObject>().First();
var a = item.Properties["NumberOfProcessors"].Value;
var b = item.Properties["NumberOfLogicalProcessors"].Value;
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759179
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
class Program
{
    static void Main(string[] args)
    {
        var list = new ConcurrentBag<int>();
        var tasks = Enumerable.Range(1, 1000).Select(d => FooAsync(list)).ToArray();
        Task.WaitAll(tasks);

        foreach (var threadId in list.Distinct())
        {
            Console.WriteLine(threadId);
        }

        Console.Read();
    }

    async static Task FooAsync(ConcurrentBag<int> list)
    {
        await Task.Yield();
        list.Add(Thread.CurrentThread.ManagedThreadId);
    }
}


Так ты делай какую нибудь полезную работенку? Хоть например дергай главного пользователя своего сайта из базенки по ID?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759187
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВТак ты делай какую нибудь полезную работенку? Хоть например дергай главного пользователя своего сайта из базенки по ID?
Да какая разница, напиши вместо Task.Yield тот же Task.Delay(10). И еще, когда последний раз букварь читал про ParallelOptions.MaxDegreeOfParallelism? Перечитай его еще разок.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759201
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё дело в дефолтной установке ThreadPool.GetMinThreads, а не в количестве процессоров Тебя снова подвела безграмотность.

P.S. Тем более нужно сразу говорить, что речь о логических процессорах. Чтобы не вводить никого в заблуждение.

Итак, вернемся к нашим баранам :)

Вот тут ты ляпнул глупость:

ЕвгенийВНо каждый здравомыслящий программист видит, что если независимых групп, на которые можно разделить имеющиеся задачи превышает количество ядер процессора, то за такое распараллеливание надо молотком по пальцам!

Теперь ты согласен, что "надо молотком по пальцам" тебя, а не кого-то там другого? Имей честно признать, что ты слил. Честно признайся в некомпетентности и я отпущу тебя с миром. Покайся.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759243
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru,
Делай что нибудь полезное, а не жди.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759275
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv skyANA ,
Вторая ошибка - вы компилируете по x86. У меня мой код под эту платформу тоже работает. А под x64 нет.
Мне просто интересно, на каких процессорах ты тестируеш?
Тероретически на Итаниумах таки да, запись/увеличение счётчика не синхонизирует кеш лайнс. На Х86 кеши всегда когерентны. но вроде не всегда на АМД64. У них более слабая модель памяти чем Х86 но более строгая чем на итаниумах. Что за железо?
А то выяснится, что как ты не показывай проблему, у всех интелы :)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759314
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
//private static Queue<int> queue = new Queue<int>();
private Queue<int> queue = new Queue<int>();

static void Main(string[] args)
{
    Program prog = new Program();

    prog.Hang();
}

private void Hang()
{
    new Thread(() =>
    {
        Thread.Sleep(1000);

        lock (queue)
        {
            queue.Enqueue(1);
        }

        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Added element to queue.");

        Thread.Sleep(1000);

        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": One second later ...");
    }).Start();

    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Waiting for size change...");

    while (true)
    {
        if (queue.Count > 0)
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Noticed size change.");

            break;
        }
    }
}


Если же сделать поле статическим, то код начинает работать. Это нормально, по-вашему, писать такой код, который работает или не работает по непонятным причинам?

Arm79Далее, вы же говорили, что нужно использовать волатильность? Но почему примеры у вас без неё? Может, потому что локальные переменные и volatile несовместимы?Потому что мои примеры не демонстрируют корректное решение. Они демонстрируют некорреткность вашего решения.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759321
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
bool runner1Finished;
bool runner2Finished;

bool runner1WasFirst;
bool runner2WasFirst;

// Thread 1
runner1Finished = true;

if (!runner2Finished)
    runner1WasFirst = true;

// Thread 2
runner2Finished = true;

if (!runner1Finished)
    runner2WasFirst = true;


Если вы немного помедитируете над этим кодом, то увидите, что если только одна из переменных 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.
bool runner1Finished;
bool runner2Finished;

bool runner1WasFirst;
bool runner2WasFirst;

// Thread 1
bool iAmFirst = !runner2Finished;

runner1Finished = true;

if (iAmFirst)
    runner1WasFirst = true;

// Thread 2
bool iAmFirst = !runner1Finished;

runner2Finished = true;

if (iAmFirst)
    runner2WasFirst = true;

И все, ваш код сломан - у вас два бегуна прибежали первым, что невозможно. Хотя TSO сохранен. Более того, точно такой же эффект может возникнуть не только от реордеринга инструкций, но и от того, что кэши всегда становятся когерентными со временем, но не всегда когерентны в моменте. Поэтому один поток может записать флажок, а другой это не увидит. Почитайте про store buffer и invalidate queue на досуге.

Кстати, примерно этот же пример приведен прямо в документации интеловских процессоров. Если очень надо будет - дам вам ссылку.

В любом случае, в рассматриваемом нами некорретном коде от Arm79 проблема не в железе, а в JIT-компиляторе.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759333
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvУ меня Core i7.
В любом случае, в рассматриваемом нами некорретном коде от Arm79 проблема не в железе, а в JIT-компиляторе.
Я таки читал что кеши в х86 и х64 когерены. Но оставим кеши в стороне. В твоём примере вынисти чтение за цикл - валидная оптимизация. И таки да, проблема должна быть видна даже на однопроцесорном тазике. Только не надо на компилятор. Проблем точно не в нём.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759336
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,
Нет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue.
Виной тому, что код не останавливается - именно компмлятор, и никто иной. Это сгенерировал такой ассембли, в котором проверка вынесена за цикл. Процессор так делать не умеет, он вообще не знант, что такое «цикл».
Но разумеется, это не «проблема» и не баг. Это ожидаемое поведение. Проблема у нас сейчас только в том, что коллеги Arm79 и SkyAnA не умеют писать многопоточный код.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759356
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВcodearticles.ru,
Делай что нибудь полезное, а не жди.
Ты признаёшь, что опростоволосился? Ответь, будь мужчиной.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759369
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue.

Пакажи источник информации что кэши у х86 и х64 не когерентны. И может сможеш показать на примере?
И ненадо стигматизировать личности. Ошибки вобще свойственны людям.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759373
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - это ответ на ваш вопрос , как раз показывает, что когерентность может нарушаться.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38759391
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruЕвгенийВcodearticles.ru,
Делай что нибудь полезное, а не жди.
Ты признаёшь, что опростоволосился? Ответь, будь мужчиной.
а ты все же попробуй
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760532
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не флеима ради. Опять вникал в тему и два источника противоречат друг другу.
вот интересно кто прав.
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"?
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760547
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron ,
Первая ссылка правильная. Вторая ссылка тоже была правильной ... в то время, когда публиковалась :-)
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760569
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760585
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-овских процессоров, которые я вам приводил.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760590
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760609
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давате котлеты от мух отдельно а то скоро мы смешаем смежные и взаимосщязанные но не идентичные темы.

первое противоречие в ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model"
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760616
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
int x0 = x;
LoadStore
y = 1; // Нельзя поставить до int x0 = x;


Семантика volatile выглядит вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
volatile int x;
volatile int y;

// Запись:
...
StoreStore
LoadStore
x = 1;

// Чтение:
int y0 = y;
LoadLoad
LoadStore



Но проблема в том, что в таком варианте int y0 = y может "заехать" за x = 1 в одном потоке, что приведет к вот этому: 16627718

Поэтому на самом деле волатильный стор выглядит вот так:
Код: c#
1.
2.
3.
4.
StoreStore
LoadStore
x = 1;
StoreLoad



На x86 фенсы StoreStore, LoadLoad и LoadStore уже гарантированы архитектурой. А StoreLoad не гарантирован! Поэтому его имплементируют руками, например через "lock add(esp, 0)" или через какие-нибудь mfence.

Вывод: volatile работает не так, как обычные переменные даже на x86.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760716
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
volatile int x;
volatile int y;

// Запись:
x = 1;
// Чтение:
int y0 = y;



Но проблема в том, что в таком варианте 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"
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760744
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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."
Я вам и говорю - это неверно.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760747
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере
для y0 есть сторе и значит по утвержденю автора acquire-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая.Стора здесь нет. Вернее, может не быть: процессор может сохранить y0 в регистр, и работать там.
int y0 = y - это LOAD, а не STORE.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760748
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере
для y0 есть сторе и значит по утвержденю автора acquire-fences и release-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760749
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron4. И как вы считаете, какой ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model"Не знаю. И не знаю, зачем мне это нужно.
...
Рейтинг: 0 / 0
Потокобезопасное использование потоконебезопасных коллекций
    #38760766
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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". и оставим в стороне процессорные кеши и аспекты архитектуру.
...
Рейтинг: 0 / 0
145 сообщений из 145, показаны все 6 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Потокобезопасное использование потоконебезопасных коллекций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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