powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужен совет по реализации многопоточного приложения
52 сообщений из 52, показаны все 3 страниц
Нужен совет по реализации многопоточного приложения
    #38639552
darlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, не хватает познаний в реализации.
Имеется программа которая многопоточно опрашивает серверы, необходимо эти данные складывать в массив или в коллекцию для дальнейшей вставки в БД. Как лучше реализовать вставку всех данных с разных потоков в один массив и потом из массива в БД, ведь пока будет идти запрос вставки в БД, массив будет заполнятся.
Заранее благодарен.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38639605
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ConcurrentQueue
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38639903
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может проще вставлять из "много потоков" сразу в БД?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640468
darlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За ConcurrentQueue спасибо, не знал....
Алексей КМожет проще вставлять из "много потоков" сразу в БД?
В таком случае буду тормозить потоки с данными или есть иной способ?
Работаю с PostgreSQL
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640556
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darlov,
основная очередь - А
у каждого потока своя небольшая очередь - Б
потоки получая данные пишут сперва свою очередь (Б), как только в этой очереди, больше n записей (например 50) -
поток пробует захватить локер очереди А, и быстренько сливает туда n записей.

другой поток, к примеру раз в 5 секунд, заглядывает в очередь А, лочит её, и быстренько копирует в свою очередь С, и а "отпускает", после чего, не спеша, из очереди С все пишет в базу данных.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640564
darlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кифирчикdarlov,
основная очередь - А
у каждого потока своя небольшая очередь - Б
потоки получая данные пишут сперва свою очередь (Б), как только в этой очереди, больше n записей (например 50) -
поток пробует захватить локер очереди А, и быстренько сливает туда n записей.

другой поток, к примеру раз в 5 секунд, заглядывает в очередь А, лочит её, и быстренько копирует в свою очередь С, и а "отпускает", после чего, не спеша, из очереди С все пишет в базу данных.
А чем плох ConcurrentQueue?
Каждый поток заполняет общий ConcurrentQueue методом Enqueue, а отдельный поток забирает оттуда методом TryDequeue (удаляя старые записи) и вставляет в БД оператором COPY
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640576
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darlovВ таком случае буду тормозить потоки с даннымиВ противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640603
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darlov...А чем плох ConcurrentQueue?...
я не говорю что он плох, лично руками ConcurrentQueue "не трогал", и её комментировать не могу )
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640627
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darlov В таком случае буду тормозить потоки с данными
Рассматривайте поток как единицу работы.
Алексей К В противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ?
Имхо, слоны раньше сдохнут - чем куча иссякнет..
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640638
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darlov,
используемый провайдер поддерживаем для XXXCommand методы Begin/EndExecuteNonQuery?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640719
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К В противном случае очередь будет наполняться быстрее чем освобождаться, что приведёт к OutOfMemory ?
Имхо, слоны раньше сдохнут - чем куча иссякнет..Кто знает. Продолжительность жизни слонов - 70-100 лет.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640805
darlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы... Думаю надо тестировать в двух вариантах, не знаю как себя поведет проект при многопоточной вставке в БД большого объема данных...
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38640812
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККто знает. Продолжительность жизни слонов - 70-100 лет.
И они умирают от голода, когда стираются последние третьи зубы.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641161
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КГде-то в степипропущено...

Имхо, слоны раньше сдохнут - чем куча иссякнет..Кто знает. Продолжительность жизни слонов - 70-100 лет.
так если рассуждать гипотетически, то уходя из дома на работу нужно прощаться с родными навсегда ( каждый раз)..
хз, может и машина переехать, или скушать не того..., а приходя домой говорить - охя удача, я вернулся живым..
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641172
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчикdarlov...А чем плох ConcurrentQueue?...
я не говорю что он плох, лично руками ConcurrentQueue "не трогал", и её комментировать не могу )
Я пробовал. Ничем не плох. Наоборот, всем хорош :-). И лочить ничего не нужно.

Если потоки генерируют данные быстрее, чем в состоянии переварить СУБД, то хоть как распределяй, накопление в очереди будет.

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

darlovкак себя поведет проект при многопоточной вставке в БД большого объема данных
Зависит от СУБД. К тому же не озвучены критерии "большого" объема данных. Это сколько и как часто?

Где-то в степито уходя из дома на работу нужно прощаться с родными навсегда ( каждый раз)..
На самом деле это очень хороший совет.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641182
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей Кпропущено...
Кто знает. Продолжительность жизни слонов - 70-100 лет.
так если рассуждать гипотетически, то уходя из дома на работу нужно прощаться с родными навсегда ( каждый раз)..
хз, может и машина переехать, или скушать не того..., а приходя домой говорить - охя удача, я вернулся живым..
YouTube Video
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641191
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Вариант, когда каждый поток сам пишет в БД рабочий, но лично мне не нравится размазывание функциональности.Отнюдь. Всё зависит от написания программы. Ничто не мешает разделить запись в БД и опрос датчиков по разным классам. Один поток необязательно должен соответствовать одному классу.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641199
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНичто не мешает разделить запись в БД и опрос датчиков по разным классам
Ничто не мешает. Но это может мне не нравиться?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641209
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей КНичто не мешает разделить запись в БД и опрос датчиков по разным классам
Ничто не мешает. Но это может мне не нравиться?Конечно.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641211
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
можно, но не приветствую, имхо вставка должна осуществляться с одного места через буфер тем более если
есть несколько претендентов на вставку в очереди, можно объединить их все в одну команду, и будет ли это быстрее
чем вставка в каждой единице работы не известно, ибо есть такое ограничение ( из рихтера)
из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится, а пока ждут
это и регистры сбрасываются, и кеш первого уровня очищается....
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641235
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К,
можно, но не приветствуюИ не надо. Достаточно огласить весь список, с преимуществами и недостатками возможных подходов. ТС пусть сам решает что ему больше подходит.
Где-то в степи, имхо вставка должна осуществляться с одного места через буфер тем более если
есть несколько претендентов на вставку в очереди, можно объединить их все в одну командуВ каждом потоке так же можно организовать объединение нескольких вставок в пакет (SQL batch).
Где-то в степи, и будет ли это быстрее
чем вставка в каждой единице работы не известноЕсли есть возможность объединить в пакеты (SQL batch), то вставка будет намного быстрее.
Где-то в степи, ибо есть такое ограничение (из рихтера)
из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится, а пока ждут
это и регистры сбрасываются, и кеш первого уровня очищается....Экономия на спичках.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641242
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
авторЭкономия на спичках.
Имхо нет, писать эффективные потоки верх совершенства.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641272
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиАлексей К,
авторЭкономия на спичках.
Имхо нет, писать эффективные потоки верх совершенства.Необходимость межпроцессного взаимодействия, в данном случае необходимость опроса серверов и записи в БД, сводит все эти оптимизации к нулю.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641432
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиибо есть такое ограничение ( из рихтера)
из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится
Ты что-то путаешь. Если бы потоки ждали бы своей очереди для доступа к куче, то не было бы никакой необходимости в lock и в других методах синхронизации.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641483
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile, причем тут lock и синхронизация потоков?
куча такой же разделяемый ресурс между потоками, как и то о чем вы думаете.
только синхронизация доступом к куче управляется ядром системы, если один поток создает в куче что то new а
другой пытается создать то же что то или изменить размер уже созданного что то, то система ставит эти потоки в очередь для обращения ( один изменяет, другой ждет)
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641579
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиbazile, причем тут lock и синхронизация потоков?
куча такой же разделяемый ресурс между потоками, как и то о чем вы думаете.
только синхронизация доступом к куче управляется ядром системы, если один поток создает в куче что то new а
другой пытается создать то же что то или изменить размер уже созданного что то, то система ставит эти потоки в очередь для обращения ( один изменяет, другой ждет)
И эти люди запрещают мне ковыряться в носу)
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641659
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, одновременное выделение памяти разными потоками в куче разумеется невозможно. Эти действия должны выполняться по очереди. Но доступ к уже выделенной памяти из разных потоков никакой очередности не предполагает. И поэтому для синхронизации одновременного доступа и нужен lock. Согласен?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641777
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,
доступ это же абстрактность, на чтение какие могут быть ограничения? там принцип - кто первый тот и папа, а в лучшем случае
данные берутся из кеша данных ядра ( ну куда не лазя), вопрос стоит - если поток написан без духовных скреп
в различными излишествами расползающимися в куче, бездумными боксингами, без алокации на стеке, то как результат
он будет постоянно сидеть на блокировке к обращению к куче. Говоря по русский - с дуру можно сломать x, или поговорка об
опрятии религиозного культа индивидуума, который только только приобщился к оному...
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641789
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиbazile,
доступ это же абстрактность, на чтение какие могут быть ограничения? там принцип - кто первый тот и папа, а в лучшем случае
данные берутся из кеша данных ядра ( ну куда не лазя), вопрос стоит - если поток написан без духовных скреп
в различными излишествами расползающимися в куче, бездумными боксингами, без алокации на стеке, то как результат
он будет постоянно сидеть на блокировке к обращению к куче. Говоря по русский - с дуру можно сломать x, или поговорка об
опрятии религиозного культа индивидуума, который только только приобщился к оному...
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38641841
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileГде-то в степи, одновременное выделение памяти разными потоками в куче разумеется невозможно. Эти действия должны выполняться по очереди.
Выделение памяти в куче в .NET почти атомарная операция.
1. Возвращаем указатель на вершину кучи.
2. Увеличиваем размер указателя на величину выделенной памяти.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642764
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, ты настолько абстрактно рассуждаешь, что понять о каких блокировках идет речь понять решительно невозможно. Перейдем к конкретике.

Есть простой класс:
Код: c#
1.
2.
3.
4.
class A
{
	public int N;
}



Пример №1. Два потока читающие данные из разных переменных в куче. Есть ли здесь блокировки при обращении к куче? Если да, то в какие моменты и кто эти блокировки ставит.
Код: c#
1.
2.
3.
4.
5.
ThreadStart threadFunc = () => { A a = new A(); for (int i = 0; i < Int32.MaxValue; i++) Console.WriteLine(a.N); } };
Thread t1 = new Thread(threadFunc);
Thread t2 = new Thread(threadFunc);
t1.Start();
t2.Start();



Пример №2. Два потока записывающие данные в разные переменные в куче. Те же вопросы что для №1.
Код: c#
1.
2.
3.
4.
5.
ThreadStart threadFunc = () => { A a = new A(); for (int i = 0; i < Int32.MaxValue; i++) a.N++; };
Thread t1 = new Thread(threadFunc);
Thread t2 = new Thread(threadFunc);
t1.Start();
t2.Start();



Пример №3. Два потока записывающие данные в общую переменную в куче. Те же вопросы что для №1.
Код: c#
1.
2.
3.
4.
5.
6.
A a = new A();
ParameterizedThreadStart threadFunc = (o) => { A aa = (A)o; for (int i = 0; i < Int32.MaxValue; i++) aa.N++; };
Thread t1 = new Thread(threadFunc);
Thread t2 = new Thread(threadFunc);
t1.Start(a);
t2.Start(a);



Пример №4. Запись в общую переменнную + lock. Те же вопросы что для №1.
Код: c#
1.
2.
3.
4.
5.
6.
A a = new A();
ParameterizedThreadStart threadFunc = (o) => { A aa = (A)o; for (int i = 0; i < Int32.MaxValue; i++) lock(aa) { aa.N++; } };
Thread t1 = new Thread(threadFunc);
Thread t2 = new Thread(threadFunc);
t1.Start(a);
t2.Start(a);



Хочется понять на этих примерах о каких блокировках сто стороны .NET/CLR идет речь. Опустим уровни ниже - Windows и процессор. Речь только о блокировках для .NET кучи.

Приветствуются собственные примеры :)
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642766
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВыделение памяти в куче в .NET почти атомарная операция.
1. Возвращаем указатель на вершину кучи.
2. Увеличиваем размер указателя на величину выделенной памяти.
"Почти атомарная" это интересный термин :)

Я в курсе что выделение памяти в .NET так устроено. Можно предположить что изменение указателя кучи делается через Interlocked.Add() или его аналог. Здесь и будет получаться "очередь" о которой я говорил.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642793
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы все упороты
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642887
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,
а может рихтера почитать windows для профессионалов, как работают потоки с кучей или с кучами ( впрочем их может быть несколько)
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642905
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,
во всех ваших примерах происходит упаковка значения и присвоение ссылки переменной.
то есть происходит запрос на выделение памяти из кучи нeapаlloc с попутным заполнением оной и возвращается ссылка
на на объект в этой памяти .
так как указатель на динамическую кучу один для всех потоков и если два потока обратились одновременно к куче на создание,
ядро ( сервер приложения api) ставит эти потоки в очередь на обращение, потому что так (( в результате выделения и записи
может произойти казус, почти не атомарный, кучи может не хватить, тогда возникнет исключение в ядре, это исключение
отловит менеджер кучи и добавит памяти для кучи из ситстемы, но добавит в займы, при уборке если выяснятся излишки
менеджер отдаст ее обратно..
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642942
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
Постесняюсь спросить, а где хранятся value типы?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642945
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВа где хранятся value типы?
везде- в куче, стеке, регистрах
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642948
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилЕвгенийВа где хранятся value типы?
везде- в куче, стеке, регистрах
А какой командой в C# запихнуть что нибудь в регистр? Просвятите магистр?:)
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642951
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
ставьте первым или вторым параметром, очень большая вероятность что окажется в регистре
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642952
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВкакой командой в C# запихнуть что нибудь в регистр? Просвятите магистр?:)
в c# нет команд если что.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38642958
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile, автор что понять о каких блокировках идет речь понять решительно невозможно
уточню, о блокировке к доступу к куче,
то что вы приводите: мониторы аки критические секции, это вообще к обращению к куче не относится - это межпотоковое взаимодействие, хотя и базируется на реальных айпи..
а абстрактность о которой я говорю - данные можно получить из кучи сделав физический запрос , а можно из кеша данных
процессора за пару тактов, говорят что попадание очень высокое
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643279
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степито есть происходит запрос на выделение памяти из кучи нeapаlloc с попутным заполнением оной и возвращается ссылка
на на объект в этой памяти .
Ты путаешь кучу Windows c управляемой кучей. Вызов HeapAlloc будет происходить для выделеления памяти под управляемую кучу. После этого при вызове new выделение памяти сводится к перемещению указателя. Управляемой кучи конечно тоже может не хватить и тогда понадобится новый участок памяти и новый вызов HeapAlloc. Однако данный сценарий является частным случаем и срабатывает далеко не всегда т.к. место в управляемой куче выделяется с запасом как раз с целью избежать обращений к WinAPI.

В итоге твоя фраза "ибо есть такое ограничение (из рихтера) из потоков обращение к куче может делать только один поток, остальные ждут, пока куча освободится" сводится к редкому сценарию выделения нового участка для управляемой кучи. Так что Алексей К был прав. Это в самом деле "Экономия на спичках." в контексте задачи работы с БД.

Где-то в степиво всех ваших примерах происходит упаковка значения и присвоение ссылки переменной.
Я вижу упаковку (boxing) только в примере №1 в вызове Console.WriteLine(). Где иы увидел упаковку в остальных примерах для меня загадка.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643536
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileЯ вижу упаковку (boxing) только в примере №1 в вызове Console.WriteLine(). Где иы увидел упаковку в остальных примерах для меня загадка.
Господь с Вами батенька!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 static void Main(string[] args)
        {
            int t = 45;
            Console.WriteLine(t);
            Console.WriteLine(t.ToString());
            object o = t;

            Console.ReadLine();
        }


Код: 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.
.method private hidebysig static 
	void Main (
		string[] args
	) cil managed 
{
	// Method begins at RVA 0x3a794
	// Code size 38 (0x26)
	.maxstack 1
	.entrypoint
	.locals init (
		[0] int32 t,
		[1] object o
	)

	IL_0000: nop
	IL_0001: ldc.i4.s 45
	IL_0003: stloc.0
	IL_0004: ldloc.0
	IL_0005: call void [mscorlib]System.Console::WriteLine(int32)
	IL_000a: nop
	IL_000b: ldloca.s t
	IL_000d: call instance string [mscorlib]System.Int32::ToString()
	IL_0012: call void [mscorlib]System.Console::WriteLine(string)
	IL_0017: nop
	IL_0018: ldloc.0
	IL_0019: box [mscorlib]System.Int32
	IL_001e: stloc.1
	IL_001f: call string [mscorlib]System.Console::ReadLine()
	IL_0024: pop
	IL_0025: ret
} // end of method Program::Main
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643553
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ, упаковка происходит не в момент вызова, а ниже по следующей цепочке:

Console.WriteLine(int) -> Console.Out.WriteLine(int) -> this.Write(int) -> this.Write(value.ToString(this.FormatProvider));
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643624
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileЕвгенийВ, упаковка происходит не в момент вызова, а ниже по следующей цепочке:

Console.WriteLine(int) -> Console.Out.WriteLine(int) -> this.Write(int) -> this.Write(value.ToString(this.FormatProvider));
Стек вызовов.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public static void WriteLine(int value)
{
	Console.Out.WriteLine(value);
}
public virtual void WriteLine(int value)
{
	this.Write(value);
	this.WriteLine();
}
public virtual void Write(int value)
{
	this.Write(value.ToString(this.FormatProvider));
}
public string ToString(IFormatProvider provider)
{
	return Number.FormatInt32(this, null, NumberFormatInfo.GetInstance(provider));
}
public static extern string FormatInt32(int value, string format, NumberFormatInfo info);
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643630
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При вызове методов структур упаковки-распоковки не происходит!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public struct Struct1
        {
            public string String1()
            {
                return "Struct1.String1";
            }
        }
        static void Main(string[] args)
        {
            Struct1 stru;
            Console.WriteLine(stru.String1());
            object o = stru;

            Console.ReadLine();
        }


Код: msil
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.
.method private hidebysig static 
	void Main (
		string[] args
	) cil managed 
{
	// Method begins at RVA 0x3a794
	// Code size 28 (0x1c)
	.maxstack 1
	.entrypoint
	.locals init (
		[0] valuetype ConsoleApplication1.Program/Struct1 stru,
		[1] object o
	)

	IL_0000: nop
	IL_0001: ldloca.s stru
	IL_0003: call instance string ConsoleApplication1.Program/Struct1::String1()
	IL_0008: call void [mscorlib]System.Console::WriteLine(string)
	IL_000d: nop
	IL_000e: ldloc.0
	IL_000f: box ConsoleApplication1.Program/Struct1
	IL_0014: stloc.1
	IL_0015: call string [mscorlib]System.Console::ReadLine()
	IL_001a: pop
	IL_001b: ret
} // end of method Program::Main
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643682
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ, ты прав. Упаковки нет. Я перепутал это с ситуацией когда мы явно приводим значение value типа к интерфейсу и обращаемся к его членам. Тогда упаковка выполняется.

P.S. Надо бы перечитать четвертое издание CLR via C# :)
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38643944
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,авторТы путаешь кучу Windows c управляемой кучей
Я вас не понял, я всегда считал что управляемая куча, это обыкновенная куча "Windows " над которой наблюдает мусорщик.
ну а стратегия выделения памяти, это просто стратегия выделения свободного места , любая куча может быть динамической и
нет, может освобождать блоки, может делать дефрагментацию, может иметь синхронный доступ для потоков, но по умолчанию он отключен, и рекомендуют его включать только при одно поточном режиме или доступ потоков к куче синхронизируется программно из вне.
Выходит есть какие то особые кучи и с которыми ядро работает по своим правилам?
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38644009
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиЯ вас не понял Предлагаю на ты.

Где-то в степия всегда считал что управляемая куча, это обыкновенная куча "Windows " над которой наблюдает мусорщик. Технически куча .NET является частью кучи Windows. .NET запрашивает память у Windows блоками и "выделяет" память внутри этого блока. Эти блоки и есть управляемая куча. Запрос к WinAPI делается только за новым большим блоком. Такой подход избавляет от необходимости обращаться при каждом new T() к Windows, ускоряя выделение памяти в управляемой куче.

Где-то в степиВыходит есть какие то особые кучи и с которыми ядро работает по своим правилам? Ты пытаешься на слишком низком уровне это анализировать. Это нужно и полезно, но в данном случае ведет к неточным выводам. .NET запросила память в куче потока и делает с этой памятью все что ей нужно - выделяет память при new(), организует сборку мусора, дефрагментирует и т.д. Ядро к участку памяти занятой кучой .NET никаких особых правил не применяет.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38644051
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще куча, некая абстракция, которая подразумевает алгоритм выделения-высвобождения памяти. При желании и наличии мозгов, можно реализовать самому.
В стандартной, по умолчанию тупо храниться список свободных-занятых участков. И выделение памяти подразумевает поиск по списку участка подходящего размера.
Не самые глупые люди постарались и сделали свою реализацию, которая избавляет программистов от многих проблем.
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38644093
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,автор некая абстракция это относительное понятие, чем больше знаний тем дальше отодвигается абстракция
и если взять невозможное - полное знание, абстракция исчезнет, тоже самое с кучей, если есть команда createheap это не абстракция
и если она глобальная то организуется поочередный доступ к ней, тоже не абстакция
Термин - экономия на спичках, ну это вообще из области русского менталитета.
Перечитываю Рихтера, иногда ваще бесит:
- этот код не оптимальны, так как в этом месте происходит упаковка.
давайте перепишем , что бы ее не было.
Ктонить из нас об этом заботился? и таких спичек очень много.
вот пример, все знают про байт код, и что вызов метода может быть
call? и callvirt, различие в виртуальном происходит проверка this на нуль, а в простом нет.
проверка вроде тоже экономия на спичках...

new A().Foo();// вызывается call без проверки ( среда верит)

var ee=new A();
ee.Foo(); //Вызывается callvirt ( среда сомневается)
Оптимизация? конечно да..
...
Рейтинг: 0 / 0
Нужен совет по реализации многопоточного приложения
    #38644190
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о боже сколько энергии, кобзон отдыхает...
[spoiler]

YouTube Video
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужен совет по реализации многопоточного приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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