powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужен совет по реализации многопоточного приложения
25 сообщений из 52, страница 2 из 3
Нужен совет по реализации многопоточного приложения
    #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
25 сообщений из 52, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужен совет по реализации многопоточного приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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