|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
||||||
Скорость работы с lock29.01.2014, 09:12. Показов 2506. Ответов 17
Метки нет (Все метки)
Здраствуйте уважаемые специалисты по .NET.
Разрабатываю сервер на C# и озадачился вот каким вопросом: допустим имею List<Socket>, в листе находится 20 объектов, от первого объекта (сокета) поступает сообщение, которое я должен либо а) дублировать всем объектам в листе либо б) дублировать одному конкретному объекту Все работает правильно в рассужденияъ, если в данный момент с List<Socket> работает один поток. Но если к List<Socket> вдруг обратятся одновременно 20 потоков (от всех пришло сообщение), которые не только проходят по листу и отправляют месседж, а еще и на основании содержимого месседжа могут закрыть сокет и удалить его из листа, то в таком случае терзают смутные сомнения, каким образом разрулить атомарный доступ и не потерять производительность.
все-таки volatile list или non-volatile list?
0
|
||||||
| 29.01.2014, 09:12 | |
|
Ответы с готовыми решениями:
17
Особенности работы оператора lock
Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock |
| 29.01.2014, 11:04 | ||
|
lock не влияет на производительность (во всяком случае ощутимо).
1
|
||
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
||||||
| 29.01.2014, 12:05 [ТС] | ||||||
|
Хм... то есть ничего, что в
Дак всё-таки volatile list<T> или нет?
0
|
||||||
|
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
|
|
| 29.01.2014, 13:22 | |
|
Этим модификатором помечается переменная которая может быть изменена из разных потоков, без синхронизирующих конструкций, допускающих изменять ее только 1 потоку.
В данном случае вы хотите пометить им ссылочный тип, а значит, что значение переменной можно менять из разных потоков. Но значение переменной для ссылочного типа это всегда ссылка. А вы же не меняете в каждом потоке ссылку, вы меняете объект по ссылке, по этому этот модификатор, данном случае вообще не имеет никакой ценности.
1
|
|
|
|
||
| 29.01.2014, 13:25 | ||
|
- один из 20 отваливается. - в списке удаляется отвалившийся сокет, причем он был в начале. Как следствие -- список сдвинулся влево. - в это время всем рассылалось сообщение и цикл стоял в середине. Как следствие -- пропустится один сокет. По идеи listSocket.sendTo(msg); должно асинхронно закидывать в поток текущему сокету сообщение. То есть вызвали метод и "моментально" идем дальше, а он себе в другом потоке отсылает.
0
|
||
| 29.01.2014, 13:34 | ||
|
У каждого есть своя очередь, не важно где он в верху или в низу, мы просто ему говорим что есть сообщение, а он уже сам решает когда его послать. Описанная вами проблема отсутствует.
0
|
||
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
||||
| 29.01.2014, 13:39 [ТС] | ||||
Поэтому надо лочить проход по листу и этим же мьютексом лочить удаление из очереди, но что будет если поток каждого клиента будет лочить лист... боюсь получить тормоза при интенсивном обмене.. Добавлено через 2 минуты Когда делал точно такое же на Java без синхронизации у меня были "трудноуловимые баги", когда месседж приходил не всем клиентам. Добавлено через 1 минуту
0
|
||||
| 29.01.2014, 13:40 | ||
|
0
|
||
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
||
| 29.01.2014, 13:43 [ТС] | ||
|
не ясно насколько будет это тормозить конечное приложение при кол-ве клиентов 10-50 при наихудшем раскладе.
0
|
||
| 29.01.2014, 13:45 | |||||||
0
|
|||||||
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
|
| 29.01.2014, 13:46 [ТС] | |
|
Пока что нет возможности сделать профайлинг.. вот и интересуюсь, заранее так сказать....
Добавлено через 45 секунд Код исполняется одним потоком?
0
|
|
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
|
| 29.01.2014, 13:52 [ТС] | |
|
По логике поток должен каждый раз обходить List на выявление нужного элемента.
Но возможно (говорю, как человек представляющий процессы под капотом CLR слабо и в теории), что JIT оптимизирует обход листа закэшировав одного клиента.
0
|
|
| 29.01.2014, 13:57 | ||
|
Если первый вариант, то вы столкнетесь с ситуацией, когда нужно отправить сообщение всем клиентам, но какой то из них задержит очередь, просто зависнет. Еще может быть проблема с очередностью сообщений. Если будет потеря сообщения, тогда это еще большая проблема.
0
|
||
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
|
| 29.01.2014, 14:04 [ТС] | |
|
Хех
Зависит от реализации.При синхронной записи поток запишет в буфер сокета и пойдет дальше, если сокет еще не прожевал данные от предыдущей записи, поток дождется пока сокет закончит. При асинхронной, вызовется (асинхронно) процедура записи в сокет, а поток обхода пойдет далее.... таки да, если интенсивно грузить асинхронной записью - может случится лажа, если синхронно грузить, могут случится тормоза или переполнение буфера (потеря месседжа) на приемной стороне. Вообщем идею я понял, нужна дополнительная прослойка между сокетом с его бУферами и основным потоком. Этакий AsyncWriter, контролирующий правильную запись в сокет со своим Concurrent.List<T>.
0
|
|
| 29.01.2014, 14:06 | ||
Сообщение было отмечено Psilon как решение
Решение
1
|
||
|
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
|
|
| 29.01.2014, 14:07 [ТС] | |
|
спасибо, вопрос исчерпан
0
|
|
| 29.01.2014, 14:07 | |
|
Помогаю со студенческими работами здесь
18
Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает! Работа с клавиатурой (клавиши num lock, caps lock, scroll lock) Горят лампочки caps lock и num lock, ноутбук не включается
Как заменить ScroLL Lock на Caps Lock Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|