powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточность и разделяемые ресурсы.
72 сообщений из 72, показаны все 3 страниц
Многопоточность и разделяемые ресурсы.
    #38606144
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется приложение в котором работают 3 потока - приложения и 2 дополнительных. Потоки читают одни и теже данные, включая данные, полученные другими потоками, но пишут в разные места, и, вроде, никакой конкуренции не было. Однако понадобилось, чтобы потоки обращались к одному и тому-же функционалу. Для определенности пусть это будет функция
Код: c#
1.
2.
3.
4.
5.
6.
7.
double f(double x, double y, int z)
{
double a,b;
a=x; b=y;
Thread.Sleep(z); //типа что-то делаем
return a+b;
}


Что будет если потоки обратятся к функции практически одновременно? Таким, например, образом 1-й - f(2,2,20), 2-й - f(3,3,10).

1. Все будет ОК, ведь обращаемся мы к Debug.WriteLine(""), и никаких конфликтов.
2. NET блокирует функцию до освобождения ресурсов и другому потоку придется подождать, и все опять ОК.
3. И тот и другой потоки получат и в итоге одинаковый ответ, например 6.

В книжках днозначного ответа что-то не нашел - 50/50.


"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606170
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAЧто будет если потоки обратятся к функции практически одновременно? Таким, например, образом 1-й - f(2,2,20), 2-й - f(3,3,10).


1ый уснет на 20мс и вернет 4, второй на 10 мс и вернет 6. С чего бы быть по-другому?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606173
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

В вашем случае, если работа будет идти только с параметрами, переданными в функцию, то никаких проблем не будет. Функция - это выделенный кусок исполнимого кода, и его синхронизировать с чем то не нужно абсолютно. Синхронизируют, при необходимости, только доступ к данным. Например, передающиеся по ссылке объекты.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606218
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79 , Если прав Pallaris , и на время выполнения функции, она блокируется Фреймвоком, то никаких проблем не должно быть.
Однако, в одной из книг, в качестве примера, разбирался доступ к функции именно в таком ключе, что и в моем вопросе.
[quote Arm79 ]Функция - это выделенный кусок исполнимого кода,[/quote] и ее экземпляр не создается при исполнении. Если поток заходит в функцию и присваивает a=2, b=2, после чего второй поток заходит в нее-же и присваивает тем-же ячейкам памяти a=3, b=3, то первая функция на выходе return a+b получит 6, а не 2+2=4.
Arm79 Синхронизируют, при необходимости, только доступ к данным. Например, передающиеся по ссылке объекты.
Доступ к функции, как правило, и есть доступ к объектам и получение ссылки на объект. И что там происходит в объекте, далеко не всегда очевидно.
Хорошо пусть будут данные, пусть при обращении к функции объекта мы должны получить коллекцию строк (Rows), а другой поток одновременно хочет получить некую другую коллекцию.
Хотелось бы подчеркнуть, что потоки пишут данные в разные места, и здесь четко разделены, а вот читают одни и те-же, либо данные других потоков, но чтение идет в разном контексте. Т.е. обращаясь к одним и тем-же функциям объектов делают разные вызовы.
Хотелось бы, чтобы Pallaris был прав, но где это четко прочитать?
Если возможно, цитату с ссылкой. К сожалению, в Инете ищется все хуже и хуже. :(
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606248
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAчего второй поток заходит в нее-же и присваивает тем-же ячейкам памяти a=3, b=3
Осталось только понять, с чего вы взяли, что там те же ячейки? В вашем примере параметры метода - примитивные типы, следовательно, происходит передача по значению (а не по ссылке). Из чего следует, что каждый вызов метода приведет к копированию входных данных. То есть ячейки будут разными по любому.

YUBAХотелось бы, чтобы Pallaris был прав
Может, вы огорчитесь, но Pallaris прав.

YUBAХотелось бы подчеркнуть, что потоки пишут данные в разные места, и здесь четко разделены, а вот читают одни и те-же, либо данные других потоков, но чтение идет в разном контексте. Т.е. обращаясь к одним и тем-же функциям объектов делают разные вызовы.
Тут вообще ничего не понятно


YUBAпусть при обращении к функции объекта мы должны получить коллекцию строк (Rows), а другой поток одновременно хочет получить некую другую коллекцию.
А в чем вопрос то? Если функция создает в своем теле коллекцию строк (а не копирует откуда то), то эта коллекция никак не перемешается с другой
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606251
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
YUBAК сожалению, в Инете ищется все хуже и хуже. :( гыгыгы
Узбагойтесь, вернитесь к истокам : организация памяти, коль затронули функции - почитайте про стек вызовов (call stack)
с такой кашей в голове дальше двигать нельзя ((
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606255
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
Читаем Рихтера "... Net via C#"
РихтерВ то же время FCL не гарантирует безопасности в отношении потоков
экземплярным методам, так как введение в них запирающего кода слишком
сильно сказывается на производительности. Более того, если каждый экземплярный
метод начнет выполнять запирание и отпирание, все закончится тем,
что в приложении в каждый момент времени будет исполняться только один
поток, что еще больше снизит производительность. Как уже упоминалось, поток,
конструирующий объект, является единственным, кто имеет к нему доступ.
Другим потокам данный объект недоступен, а значит, при вызове экземплярных
методов синхронизация не требуется. с. 855
Эт хорошо, что прав. И скорее всего прав. Но понимания физики процесса нет.
Но получается, что при обращении к функции объекта из потока, должна создаваться полная копия объекта содержащего эту функцию и взаимосвязанных объектов. Ведь она, функция, может содержать множество других функций как самого объекта, так и других объектов, а те в свою очередь... до бесконечности. Такое предположение - это дурдом. Вряд-ли это возможно.
Если это не так, никакое копирование переменных в вызове функции не поможет, да и копируются они в функцию (точки входа). Что мешает их значения изменить другому потоку? Т.е., для нашего примера a и b должны поменяться на с 2, 2 на 3,3 при обращении из другого потока.
Копирование же значений переменных в вызываемую функцию безопасно только для вызывающего объекта, для чего, собственно и сделано. Но никакой гарантии, что копии кто-то не изменит и функция будет работать нештатно.
Но Вы сами писали Arm79Функция - это выделенный кусок исполнимого кода Т.е.. видимо, для всех потоков, это одни и те же ячейки памяти.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606261
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, я собственно и хочу разобраться.
А про стек - каждый поток имеет свой стек.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606262
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РихтерКогда
поток конструирует новый объект при помощи оператора new, оператор возвращает
ссылку на этот объект. Причем в этот момент ссылка имеется только у создающего
объект потока, другие потоки не имеют к нему доступа. Если не передавать
эту ссылку другому потоку, который может использовать объект одновременно
с потоком, создавшим объект, необходимость в синхронизации отпадает.
В моем случае все потоки работают с одними и теми же объектами и их методами.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606315
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

в твоем случае - это в каком? В том примере, что ты привел, нет никаких объектов, и при вызове метода все переменные a,b,x,y,z для любого из потоков - уникальные (находятся в разных ячейках памяти в момент выполнения)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606354
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAЧитаем Рихтера "... Net via C#"
В том куске, который вы привели, смысла мало. Очевидно, это вырванные их контекста фразы.
YUBAпри обращении к функции объекта из потока, должна создаваться полная копия объекта содержащего эту функцию и взаимосвязанных объектов
это неверная фраза.
YUBAЕсли это не так, никакое копирование переменных в вызове функции не поможет, да и копируются они в функцию (точки входа)
это тоже какая то фантастика. причем ненаучная :-)
YUBAКопирование же значений переменных в вызываемую функцию безопасно только для вызывающего объекта, для чего, собственно и сделано. Но никакой гарантии, что копии кто-то не изменит и функция будет работать нештатно.
Вам Где-то в степи подсказал почитать про стек вызовов. Жаль, вы не следуете хорошим советам.
YUBAArm79Функция - это выделенный кусок исполнимого кода Т.е.. видимо, для всех потоков, это одни и те же ячейки памяти.
У вас какое то катастрофическое непонимание. Функция - это исполнимый код. То есть инструкции процессора. Алгоритм. Если 10 участников работают по одному алгоритму, из этого не следует, что они должны работать поочередно. Они вполне могут и работать параллельно. Синхронизировать их работу нужно только в том случае, если все участники используют какие-то общие для всех вещи. Например, если вы сколачиваете табуретку, как и ваши соседи на уроке труда, то при наличии своих инструментов вы не обязаны оглядываться на них. Но если у вас один молоток на класс, вам придется волей-неволей как-то становиться в очередь к нему.

Конечно, мое описание сильно уступает Рихтеру, да и по хорошему это абстракция, на которую накладываются физические ограничения памяти и процессора, но на вашем уровне это не важно пока что. ОС и компилятор скроют от вас такие "мелочи".

Да, повторюсь. Ячейки памяти - это данные. Метод - это инструкции. Они к данным отношения не имеют.




Теперь на примере кода. Этот код всегда будет выдавать одни и те же результаты при тех же входных данных при любом количестве потоков, в которых метод будет вызываться. Потому что в x и y передаются копии значений. И связи с оригиналом нет.
Код: c#
1.
2.
3.
4.
5.
public long Func1(int x, int y)
{
    Thread.Sleep(100);
    return x * y;
}



а вот этот код нельзя назвать потокобезопасным, потому что параметр p передает ссылку на объект. А сам объект может изменяться одновременно с этим методом и в других местах.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class MyPoint
{
    public int x {get; set; }
    public int y {get; set; }
}

public long Func1(MyPoint p)
{
    Thread.Sleep(100);
    return p.x * p.y;
}
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606359
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот если бы было

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
double a,b;

double f(double x, double y, int z)
{
a=x; b=y;
Thread.Sleep(z); //типа что-то делаем
return a+b;
}
}



Вот тогда бы начались проблемы при вызове из разных потоков

Код: c#
1.
2.
A.f(2,2,20);
A.f(3,3,10);



т.к. переменные a и b будут общими для обоих потоков
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606377
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAих методами.

А мне понятно, почему вы запутались.

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

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

Вы вобще знаете как работает процессор при переходе типа GOTO 555? Там есть регистр адреса, и вот при обычном проходе адрес просто увеличивается на единицу, а при прямом переходе - в регистр записывается 555 и следующая команда уже будет №555.
То есть, по всей своей немаленькой памяти процессор перемещается мгновенно (за одну операцию).
И это дает возможность свободно использовать общий участок кода (который где-то да, существует!) для всех экземпляров класса.
А вот изменяемую часть - переменные, массивы переменных - это да, пишется в разное место для каждого нового экземпляра.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606388
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisВот если бы было

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
double a,b;

double f(double x, double y, int z)
{
a=x; b=y;
Thread.Sleep(z); //типа что-то делаем
return a+b;
}
}



Вот тогда бы начались проблемы при вызове из разных потоков

Код: c#
1.
2.
A.f(2,2,20);
A.f(3,3,10);



т.к. переменные a и b будут общими для обоих потоков А именно так, собственно и есть. Но, думаю, и в моем варианте хорошо не закончится. Вечером проведу натурный эксперимент.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606390
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA А именно так, собственно и есть.
Зачем тогда голову морочишь неправильными примерами?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class A
{
     public object syncRoot = new object();
     ....
}
// в каком-то потоке
lock (someA.syncRoot)
{
    A.f(2,2,20);
}

// в каком-то другом потоке
lock (someA.syncRoot)
{
    A.f(3,3,10);
}



Вечером проведу натурный эксперимент.

Удачи
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606398
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAВечером проведу натурный эксперимент.
Проведите лучше мысленный.
Если бы для разделения того, что функция делает, программисту на языке высокого уровня приходилось бы заморачиваться
проблемами низкого уровня - то уже давно бы это изменили.
И уже давно изменили.
:-)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606404
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129YUBAих методами.Вы вобще знаете как работает процессор при переходе типа GOTO 555? Там есть регистр адреса, и вот при обычном проходе адрес просто увеличивается на единицу, а при прямом переходе - в регистр записывается 555 и следующая команда уже будет №555.
То есть, по всей своей немаленькой памяти процессор перемещается мгновенно (за одну операцию).
И это дает возможность свободно использовать общий участок кода (который где-то да, существует!) для всех экземпляров класса.
А вот изменяемую часть - переменные, массивы переменных - это да, пишется в разное место для каждого нового экземпляра.Вообще знаю, и как процессор, и что есть стек, и что туда пишется. А еще и вышивать умею, на ассемблере раньше приходилось, и в машинных кодах тоже.
Именно, отталкиваясь от низкого уровня, все больше полагаю, что 2+2=6. Если в NET MS что-то не придумал.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606475
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA в NET MS что-то не придумал.

С++ писал не микрософт. Понятие "класс" тоже не их.
:-)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606490
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAВообще знаю, и как процессор, и что есть стек, и что туда пишется.
не похоже
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606520
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
авторА про стек - каждый поток имеет свой стек. == сахар белый
проведите мысленный эксперимент: В стеке вызовов замените вызов функции inline встройкой в вышестоящий стек
у вас че поток загнется? хотя компилятор это делает на ура и даже по принуждению (AggressiveInlining).
или передайте тело как аргумент
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
            new Thread(s => ((Func<double, double, int, double>)s)(1, 2, 3)).
            Start((Func<double, double, int, double>)((x, y, z) =>
            {
                double a, b;
                a = x; b = y;
                Thread.Sleep(z); //типа что-то делаем
                return a + b;
            }));


тут никто не будет бить по рукам за это..
все Ваши фобии вызывают улыбку с ассоциацией юноши, который подрочив боится заразиться триппером ))
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606531
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результаты натурного эксперимента.
Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
public class A1
    {
        Thread t1;
        Thread t2;
        B1 B10 = new B1();
          
        public A1()
        {
        t1 =new Thread(dt1);
        t2 =new Thread(dt2);
        t1.Start();
        t2.Start();
        }
        
        void dt1()
        {
            Double x = 2, y = 2;
            Debug.WriteLine("Поток t1", "2+2=");
            Debug.WriteLine(B10.f(ref x,ref y,220), "2+2=");
        }
        
        void dt2()
        {
            for(int i=0; i<5; i++)
            {
                Double x=3,  y=3;
                Debug.WriteLine("Поток t2", "3+3=");
                Debug.WriteLine(B10.f(ref x, ref y, 50), "3+3=");
            }

        }

        double f(double x, double y, int z)
        {
            double a, b;
            a = x; b = y;
            Thread.Sleep(z);
            return a + b;
          }
    
class B1
    {
        public B1()
        { }

        public double f(ref double x, ref double  y, int z)
        {
            double a, b;
            a = x; b = y;
            double c;
            c = a + b;
            String s = x + "" + y + " " + z + " " + c;
            Debug.WriteLine(z, "Задержка");
            Thread.Sleep(z);
            Debug.WriteLine(s);
            return a + b +c+x+y;
        }
   }


2+2=: Поток t1
3+3=: Поток t2
Задержка: 50
Задержка: 220
33 50 6
3+3=: 18
3+3=: Поток t2
Задержка: 50
33 50 6
3+3=: 18
3+3=: Поток t2
Задержка: 50
33 50 6
3+3=: 18
3+3=: Поток t2
Задержка: 50
33 50 6
3+3=: 18
3+3=: Поток t2
Задержка: 50
22 220 4
2+2=: 12
Поток '<Без имени>' (0xca4) завершился с кодом 0 (0x0).
33 50 6
3+3=: 18
Поток '<Без имени>' (0x1030) завершился с кодом 0 (0x0).
Поток '<Без имени>' (0x1064) завершился с кодом 0 (0x0).
Все, как видно, ОК. Каждый поток работает со своим образом функции.
Тема исчерпана.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606571
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

YUBAсвоим образом функции
Что такое "образ функции" ?)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606607
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchЧто такое "образ функции" ?)Образ - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств.
Как конкретно это реализовано MS не имеет значения.

Да, Всем Спасибо!
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606611
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBALelouchЧто такое "образ функции" ?)Образ - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств.
кто на ком стоял?(с)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606621
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAОбраз - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств.


Экземпляр метода - он всегда один в памяти.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606634
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

YUBAКак конкретно это реализовано MS не имеет значения.

МС это реализовало так, что у них всего 1 экземпляр метода в памяти, что вы там выдумали из своего "знания" машинных кодов © я даже представить боюсь
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606678
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisYUBAОбраз - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств.
Экземпляр метода - он всегда один в памяти.Понятия не имею, но каждый поток использует только и исключительно свои все переменные определенные в функции, что видно из распечатки вывода.
И как MS это делает, копированием кода всех используемых функций, сохранением копии всех переменных в теле используемых потоком функций на время прерывания, либо переменные создаются в адресном пространстве потока, не ясно. Но нам нужен сам факт сего.
Интересно еще и то, что функция не блокируется (как кто-то сказал), и может не конфликтуя выполняться одновременно несколькими потоками.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606688
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
Вы вообще представляете что такое функция? интересно было бы услышать ))
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606697
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAИнтересно еще и то, что функция не блокируется (как кто-то сказал).

Самое интересное, что это ты и скзал, присовоив почему то мне
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606701
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAДоступ к функции, как правило, и есть доступ к объектам и получение ссылки на объект
это просто вызов кода
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606711
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisСамое интересное, что это ты и сказал, присвоив почему то мнеЯ не помню кто. :) Ну, пусть я. Без разницы.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606712
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ладно, уже флуд пошел. Все уже ясно. Тема исчерпана.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38606725
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAЯ не помню кто. :) Ну, пусть я. Без разницы.
тролль худосочный
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38607885
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
А теперь проведите "натурный" эксперимент вот с таким кодом:
Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
public class A1
    {
        Thread t1;
        Thread t2;
        B1 B10 = new B1();
          
        public A1()
        {
        t1 =new Thread(dt1);
        t2 =new Thread(dt2);
        t1.Start();
        t2.Start();
        }
        
        void dt1()
        {
            Double x = 2, y = 2;
            Debug.WriteLine("Поток t1", "2+2=");
            Debug.WriteLine(B10.f(ref x,ref y,220), "2+2=");
        }
        
        void dt2()
        {
            for(int i=0; i<5; i++)
            {
                Double x=3,  y=3;
                Debug.WriteLine("Поток t2", "3+3=");
                Debug.WriteLine(B10.f(ref x, ref y, 50), "3+3=");
            }

        }
  }

  
class B1
    {

        private double a, b;
        private double c;

        public B1()
        { }

        public double f(ref double x, ref double  y, int z)
        {
            Debug.WriteLine(Thread.CurrentTread.ManagedThreadId, "Вычисления");
            a = x; b = y;
            c = a + b;

            String s = x + "" + y + " " + z + " " + c;

            Debug.WriteLine(Thread.CurrentTread.ManagedThreadId, z, "Задержка");
            Thread.Sleep(z);
            Debug.WriteLine(Thread.CurrentTread.ManagedThreadId, s);

            s = a + "" + b + " " + z + " " + c;
            Debug.WriteLine(Thread.CurrentTread.ManagedThreadId, s);

            return a + b +c+x+y;
        }
   }

...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38607934
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
а ещё лучше выполнить вот этот код...
Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A1 a1 = new A1();
            a1.RunTest();
            Console.ReadLine();
        }
    }
    public class A1
    {
        Thread t1;
        Thread t2;
        B1 B10 = new B1();

        public A1()
        {
        }
        public void RunTest()
        {
            t1 = new Thread(dt1);
            t2 = new Thread(dt2);
            t1.Start();
            t2.Start();
        }

        void dt1()
        {
            Double x1 = 2, y1 = 2;
            Console.WriteLine("Поток t1 ({0}) идентификатор {1}", "2+2=", Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("t1 Результат {0}: 2+2= {1}", Thread.CurrentThread.ManagedThreadId, B10.f(ref x1, ref y1, 200));
            Console.WriteLine("Поток t1 завершен");
        }

        void dt2()
        {
            Console.WriteLine("Поток t2 {0} идентификатор {1}", "3+3=", Thread.CurrentThread.ManagedThreadId);
            Double x2 = 3, y2 = 3;
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("t2 Итерация {0}",(i+1));
                Console.WriteLine("t2 Результат {0}: 3+3= {1}", Thread.CurrentThread.ManagedThreadId, B10.f(ref x2, ref y2, 30));
            }
            Console.WriteLine("Поток t2 завершен");
            Console.WriteLine();
        }
    }


    class B1
    {

        private static double a = 0, b = 0; // < - Вот они грабли
        private static double c = 0;  // < - Вот они грабли

        public B1()
        { }

        public double f(ref double x, ref double y, int z)
        {
            Console.WriteLine("Thread ID ({0}) - Вход в f1 --------------", Thread.CurrentThread.ManagedThreadId);
            a = x; b = y;
            c = a + b;

            String s = String.Format("x = {0}, y = {1}, a = {2}, b = {3}, c = {4}", new Object[] { x, y, a, b, c });

            Console.WriteLine("Thread ID ({0}) - переменные до задержки: {1}", Thread.CurrentThread.ManagedThreadId, s);

            Console.WriteLine("Thread ID ({0}) - Задержка {1}", Thread.CurrentThread.ManagedThreadId, z);
            Thread.Sleep(z);

            s = String.Format("x = {0}, y = {1}, a = {2}, b = {3}, c = {4}", new Object[]{x,y,a,b,c});
            Console.WriteLine("Thread ID ({0}) - переменные после задержки: {1}", Thread.CurrentThread.ManagedThreadId, s);
            Console.WriteLine("Thread ID ({0}) - Выход из f1 --------------", Thread.CurrentThread.ManagedThreadId);
            return a + b + c + x + y;
        }
    }
}

...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38607984
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

ну и уже совсем для вкусности...
Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A1 a1 = new A1();
            a1.RunTest();
            Console.ReadLine();
        }
    }
    public class A1
    {
        Thread t1;
        Thread t2;
        B1 B10 = new B1();

        public A1()
        {
        }
        public void RunTest()
        {
            Console.WriteLine("Выполнение в основном потоке:");
            dt1_1();
            dt2_1();
            Console.WriteLine();
            Console.WriteLine("Выполнение в разных потоках:");
            t1 = new Thread(dt1);
            t2 = new Thread(dt2);
            t1.Start();
            t2.Start();
        }

        void dt1()
        {
            Console.WriteLine("Поток t1 ({0}) идентификатор {1}", "2+2=", Thread.CurrentThread.ManagedThreadId);
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("t1 Итерация {0}", (i + 1));
                dt1_1();
            }
            Console.WriteLine("Поток t1 завершен");
        }

        private void dt1_1()
        {
            Double x1 = 2, y1 = 2;
            Console.WriteLine("t1 Результат {0}: 2+2= {1}", Thread.CurrentThread.ManagedThreadId, B10.f(ref x1, ref y1, 70));
        }

        void dt2()
        {
            Console.WriteLine("Поток t2 {0} идентификатор {1}", "3+3=", Thread.CurrentThread.ManagedThreadId);
            //Double x2 = 3, y2 = 3;
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("t2 Итерация {0}",(i+1));
                dt2_1();
            }
            Console.WriteLine("Поток t2 завершен");
            Console.WriteLine();
        }
        void dt2_1()
        {
            Double x2 = 3, y2 = 3;
            Console.WriteLine("t2 Результат {0}: 3+3= {1}", Thread.CurrentThread.ManagedThreadId, B10.f(ref x2, ref y2, 30));
        }
    }


    class B1
    {

        // Они даже и не статичные, но всё равно засадонистые
        private double a = 0, b = 0; 
        private double c = 0;

        public B1()
        { }

        public double f(ref double x, ref double y, int z)
        {
            Console.WriteLine("Thread ID ({0}) - Вход в f1 --------------", Thread.CurrentThread.ManagedThreadId);
            a = x; b = y;
            c = a + b;

            String s = String.Format("x = {0}, y = {1}, a = {2}, b = {3}, c = {4}", new Object[] { x, y, a, b, c });

            Console.WriteLine("Thread ID ({0}) - переменные до задержки: {1}", Thread.CurrentThread.ManagedThreadId, s);

            Console.WriteLine("Thread ID ({0}) - Задержка {1}", Thread.CurrentThread.ManagedThreadId, z);
            Thread.Sleep(z);

            s = String.Format("x = {0}, y = {1}, a = {2}, b = {3}, c = {4}", new Object[]{x,y,a,b,c});
            Console.WriteLine("Thread ID ({0}) - переменные после задержки: {1}", Thread.CurrentThread.ManagedThreadId, s);
            Console.WriteLine("Thread ID ({0}) - Выход из f1 --------------", Thread.CurrentThread.ManagedThreadId);
            return a + b + c + x + y;
        }
    }
}


и результат "вкусности"
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
Выполнение в основном потоке:
Thread ID (1) - Вход в f1 --------------
Thread ID (1) - переменные до задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (1) - Задержка 70
Thread ID (1) - переменные после задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (1) - Выход из f1 --------------
t1 Результат 1: 2+2= 12 <- Это то к чему мы стремимся
Thread ID (1) - Вход в f1 --------------
Thread ID (1) - переменные до задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (1) - Задержка 30
Thread ID (1) - переменные после задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (1) - Выход из f1 --------------
t2 Результат 1: 3+3= 18 <- Это то к чему мы стремимся

Выполнение в разных потоках:
Поток t1 (2+2=) идентификатор 3
t1 Итерация 1
Thread ID (3) - Вход в f1 --------------
Thread ID (3) - переменные до задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Задержка 70
Поток t2 3+3= идентификатор 4
t2 Итерация 1
Thread ID (4) - Вход в f1 --------------
Thread ID (4) - переменные до задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Задержка 30
Thread ID (4) - переменные после задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Выход из f1 --------------
t2 Результат 4: 3+3= 18 <-Пока что нормально
t2 Итерация 2
Thread ID (4) - Вход в f1 --------------
Thread ID (4) - переменные до задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Задержка 30
Thread ID (4) - переменные после задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Выход из f1 --------------
t2 Результат 4: 3+3= 18 <-И второй раз нормально
t2 Итерация 3
Thread ID (4) - Вход в f1 --------------
Thread ID (4) - переменные до задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Задержка 30
Thread ID (3) - переменные после задержки: x = 2, y = 2, a = 3, b = 3, c = 6
Thread ID (3) - Выход из f1 --------------
t1 Результат 3: 2+2= 16 <-Оппаньки, а это что за хрень? См. причину выше
t1 Итерация 2
Thread ID (3) - Вход в f1 --------------
Thread ID (3) - переменные до задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Задержка 70
Thread ID (4) - переменные после задержки: x = 3, y = 3, a = 2, b = 2, c = 4
Thread ID (4) - Выход из f1 --------------
t2 Результат 4: 3+3= 14 <-Опять хрень
t2 Итерация 4
Thread ID (4) - Вход в f1 --------------
Thread ID (4) - переменные до задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Задержка 30
Thread ID (4) - переменные после задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Выход из f1 --------------
t2 Результат 4: 3+3= 18 <-Исправились вроде как
t2 Итерация 5
Thread ID (4) - Вход в f1 --------------
Thread ID (4) - переменные до задержки: x = 3, y = 3, a = 3, b = 3, c = 6
Thread ID (4) - Задержка 30
Thread ID (3) - переменные после задержки: x = 2, y = 2, a = 3, b = 3, c = 6
Thread ID (3) - Выход из f1 --------------
t1 Результат 3: 2+2= 16 <-И опять непонятки
t1 Итерация 3
Thread ID (3) - Вход в f1 --------------
Thread ID (3) - переменные до задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Задержка 70
Thread ID (4) - переменные после задержки: x = 3, y = 3, a = 2, b = 2, c = 4
Thread ID (4) - Выход из f1 --------------
t2 Результат 4: 3+3= 14 <- И снова хрень
Поток t2 завершен

Thread ID (3) - переменные после задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Выход из f1 --------------
t1 Результат 3: 2+2= 12 <-Нормально
t1 Итерация 4
Thread ID (3) - Вход в f1 --------------
Thread ID (3) - переменные до задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Задержка 70
Thread ID (3) - переменные после задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Выход из f1 --------------
t1 Результат 3: 2+2= 12 <-Нормально
t1 Итерация 5
Thread ID (3) - Вход в f1 --------------
Thread ID (3) - переменные до задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Задержка 70
Thread ID (3) - переменные после задержки: x = 2, y = 2, a = 2, b = 2, c = 4
Thread ID (3) - Выход из f1 --------------
t1 Результат 3: 2+2= 12 <-Нормально
Поток t1 завершен
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38608870
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov, да, спасибо.
Ну, от переменных класса ничего другого ожидать и не приходится. Эт понятно.
Меня Рихтер сильно заморочил - вот этим:
РихтерВ то же время FCL не гарантирует безопасности в отношении потоков
экземплярным методам, так как введение в них запирающего кода слишком
сильно сказывается на производительности. У него еще есть рассуждения на эту тему. Там ни слова о переменных класса. Передача в функцию по ссылке или значению здесь тоже ни с какого бока.
Что он подразумевает под отсутствием "гарантии безопасности в отношении потоков" именно "экземплярным методам", так и не понял.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38608977
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAЧто он подразумевает под отсутствием "гарантии безопасности в отношении потоков" именно "экземплярным методам", так и не понял.

Ну это скорее товарищь Рихтер не понял, что нужно обьяснять, что подобная опасность касается только общих ресурсов, а не переменных в области видимости конкретной функции....
:-)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609028
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129, с общими ресурсами я решил просто, без всяких "запираний-отпираний".
Данные, порожденные потоками, имеют временную метку, и измениться уже не могут. Другие потоки обращаются только к последней временной метке или более ранним. Все асинхронно.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609041
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
гыгы
авторДанные, порожденные потоками, имеют временную метку, и измениться уже не могут. Другие потоки обращаются только к последней временной метке или более ранним. Все асинхронно.
что только не придумают русские, лишь бы не строить дороги..))))))))
зы я надеюсь это не в production ( так риторически)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609045
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиУзбагойтесь, вернитесь к истокам : организация памяти, коль затронули функции - почитайте про стек вызовов (call stack)
((

В качестве ликбеза поясни пожалуйста: почему аргументы вызова пушатся в стек раньше точки возврата в функцию вызова (ведь они попнутся в итоге позже, чем точка возврата, а должно быть наоборот по идее), и в какой момент в стек пушатся локальные переменные, и когда и кем они попаются оттуда.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609058
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиYUBA,
гыгы
что только не придумают русские, лишь бы не строить дороги..))))))))
зы я надеюсь это не в production ( так риторически)
Послушайте, Гыгы, вы когда нибудь вообще что-либо читали, кроме программирования?
Или только "делать умный вид и надувать щеки"(с) ?
В этом подходе ничего нового, применяется с момента рождения цифровой обработки.
Так, кстати, я вообще не программист, и программирование для меня не более, чем вспомогательный инструмент.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609071
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris,
аргуметны пишутся раньше перед вызовом call, просто перед ними идет переворот стека, не понял про локальные
пишет хозяин кода, если это аргументы снаружи, там возможно укладка двух первых в регистр процессора минуя память
( обсуждали тут вроде)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609082
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAТак, кстати, я вообще не программист, и программирование для меня не более, чем вспомогательный инструмент.
А почему тогда возмущаетесь удивлением профессиональных программистов непрофессиональному решению?


YUBAДругие потоки обращаются только к последней временной метке или более ранним
Вы учитываете, что тут тоже скорее всего будут нужны "отпирания/запирания"?

Вероятно, если вы приведете пример РЕАЛЬНОЙ задачи, которую решаете, а не какие-то синтетические варианты, вам помогут более конкретно
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609085
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAAlex Kuznetsov, да, спасибо.
Ну, от переменных класса ничего другого ожидать и не приходится. Эт понятно.
Меня Рихтер сильно заморочил - вот этим:
РихтерВ то же время FCL не гарантирует безопасности в отношении потоков
экземплярным методам, так как введение в них запирающего кода слишком
сильно сказывается на производительности. У него еще есть рассуждения на эту тему. Там ни слова о переменных класса. Передача в функцию по ссылке или значению здесь тоже ни с какого бока.
Что он подразумевает под отсутствием "гарантии безопасности в отношении потоков" именно "экземплярным методам", так и не понял.Я считаю, что мой пример показывает именно то, что Рихтер и имел в виду.
Методы экземпляра могут как работать с переменными класса, "внешними" по отношению к ним(методам), так и не работать с ними.
Отсюда и нет гарантии безопасности без использования блокировок.
Использование-же блокировок замедляет работу методов в силу вынужденного простоя во время ожидания снятия блокировки.
По моему всё достаточно логично и понятно.
Я считаю, что лучше в данном случае прибегнуть к Бритве Оккама и по возможности отказаться от использования разделяемых ресурсов, т.е. "внешних" по отношению к методу экземпляра переменных, при работе в многопоточной среде, дабы не замедлять работу блокировками.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609088
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи просто перед ними идет переворот стека,
O.O это что за чудо-операция такая?

не понял про локальные


Ну пишут в Вики, что стек может использоваться для хранения локальных переменных - только не пишут как и зачем (разве что при рекурсии?)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609110
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris,
аргументы идут раньше вызова, после вызова происходит проброс результата в локальную переменную, ну может быть тут действительно не уместно переворот (stloc.0),
вот про рекурсию не скажу, как бы логично разматывать стек без видимых локальных переменных
но проброс всеравно скорее будет чисто техническии ?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609117
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
да не прибедняйтесь, я то же уже пол года, и не собираюсь пока , скучно и не интересно.
лучше бездельничать и лазить по спортзалам ))
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609120
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79YUBAДругие потоки обращаются только к последней временной метке или более ранним
Вы учитываете, что тут тоже скорее всего будут нужны "отпирания/запирания"?
Для чего? Все данные записываются в строки таблиц DataTable c ключевым полем [DateTime]. Выборка по View.RowFilter="DateTime <= '" + T + "'". Данные в строке больше не меняются. При готовности новых данных пишутся новые строки в таблицы с другим Т. Производящий поток сам решает какое время Т(n+1) >T(n) ему указать. А др потоки, какое время выбрать из <=Tn для обработки. Если нужных данных >T нет, ждем.

Arm79Вероятно, если вы приведете пример РЕАЛЬНОЙ задачи, которую решаете, а не какие-то синтетические варианты, вам помогут более конкретноСпасибо, вопросов пока нет. Разве по методу Update, но это др. тема, и пока не к спеху.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609128
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
а Вы с datatable без запираний работаете из потоков?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609134
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиYUBA,
а Вы с datatable без запираний работаете из потоков?Без. Потоки пишут в разные таблицы. Данные, пока полностью не записаны, недоступны для чтения. Флажок T в переменных.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609143
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
чето ничего не понял, если для каждого потока своя таблица, накой нам временная метка?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609145
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее, не флажок, а "указатель" на последнее Т.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609150
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
а зачем он нужен, если у каждого потока своя таблица, то последняя запись есть последняя, и никто в эту таблицу ни вставит запись, кроме этого потока?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609155
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA, боюсь вы совсем запутались. Вам самому не кажется, что связка поток + DataTable с какими-то метками + флаги - выглядит некошерно?

Кстати, работа с БД в виде DataTable ныне не самая популярная технология, хотя есть тут её апологеты. Её вам тоже Рихтер рекомендовал?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609160
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
вообще использовать dt для таких дел имхо не рационально, даже если и потом есть желание перекинуть историю работы потоков
в базу данных, это блядина занимает много места, да и дизпозе там у таблиц пустой.( вроде)
лучше использовать для этого дела коллекции..
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609162
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиYUBA,
чето ничего не понял, если для каждого потока своя таблица, накой нам временная метка?Свои таблицы. :) Чтобы потоки без проблем могли тянуть данные друг у друга, и выбирать предыдущие данные из таблиц.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609174
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, есть желание в дальнейшем в БД перекидывать. Во первых, в случае зависания можно начать с сохраненного уровня. :). Во вторых, м.б. эту лабуду придется еще обрабатывать.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609178
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
ну может я бы еще согласился что без монитора можно организовать это безобразие, но если они лазят друг к другу
без монитора это чистое имхо вакханалия.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609181
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

авторВо первых, в случае зависания можно начать с сохраненного уровня.
вообще то это называется в России пиз..ц, вот для этого и нужна тетенька или try catch что бы начать с сохраненного уровня
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609187
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиYUBA,
ну может я бы еще согласился что без монитора можно организовать это безобразие, но если они лазят друг к другу
без монитора это чистое имхо вакханалия.В старые данные. В текущие дела друг друга они не лезут.
Возьмем простенькую систему с обратной связью. Каждая из подсистем читает выход другой, и на этом основании формирует свой выход. И так до бесконечности. Форум, например, именно такая система.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609191
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степивообще то это называется в России пиз..ц, вот для этого и нужна тетенька или try catch что бы начать с сохраненного уровняВиндовз это называется. От него никакие try catch не помогают.
Только сегодня в синий экран уходил вообще на пустом месте. И далее как ни в чем не бывало.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609201
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
У вас есть таблица, в которую поток пишет данные, есть другой поток который читает или делает выборку из этих данных
данные лежат в виде коллекции datarow.
Предположим что один поток выбирает данные из коллекции ( получил квант времени)
в стеке указатель на коллекцию - выборка пошла аккумулятор копит значения, в этот момент квант истекает, весь этот стек пакуется во внутреннюю память потока
и процессор отдается потоку на вставку , другой поток благополучно вставляет запись и заканчивает работу с таблицей
процессор отдается потоку который был прерван, из него вытаскивается стек, который был прерван и задача продолжается.
но перед продолжением задачи проверяется сохранность коллекции, если коллекция была модифицирована выбрасывается
invalidoperationexception, тут какбы до фонаря что ищем старые или новые данные этож субьективно...
это может и не вывалиться с первого раза или с десятого если итерации мелкие, что мешает поставить блокировку? две строчки кода
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609332
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степивот про рекурсию не скажу, как бы логично разматывать стек без видимых локальных переменных


А где физически лежат локальные переменные? Когда под них резервируется память? Вот в этом случае:
Код: c#
1.
2.
3.
4.
5.
public int Increment(int a)
{
    int b = 1;
    return a+b;
}



переменная b - она резервируется в памяти до вызова, или во время выполнения? (без учета возможных оптимизаций непосредственной записи в регистр процессора)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609459
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisпеременная b - она резервируется в памяти до вызова, или во время выполнения? (
во время, точнее в так называемом прологе процедуры(функции, метода)
сначала сохраняются регистры(список от соглашений конкретной среды зависит),
устанавливается указатель стека (это и есть фактическое выделение памяти под локальные переменные)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609544
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

т.е. в общем случае каждая локальная переменная со значением (или ссылка на нее) лежит в стеке вызова?
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38609738
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиYUBA,
...
но перед продолжением задачи проверяется сохранность коллекции, если коллекция была модифицирована выбрасывается
invalidoperationexception, тут какбы до фонаря что ищем старые или новые данные этож субьективно...
это может и не вывалиться с первого раза или с десятого если итерации мелкие, что мешает поставить блокировку? две строчки кодаЗанялся этим вопросом. Такое может произойти, если работаем с коллекцией вообще. Например, foreach. Если же выбирается конкретика, мы получаем данные в виде "как есть". Исключений в этом случае не будет. Т.е. можно другим потоком даже писать в мои строки. Что мы там выберем, это другой ?, но выберется без проблем.
В моем случае лок не нужен.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38610203
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79YUBA, боюсь вы совсем запутались. Вам самому не кажется, что связка поток + DataTable с какими-то метками + флаги - выглядит некошерно?Эта часть порги уже работает.

Arm79Кстати, работа с БД в виде DataTable ныне не самая популярная технология, хотя есть тут её апологеты. Её вам тоже Рихтер рекомендовал?Я не апологет. :) Но если под окном стоит Запорожец, а Мерседеса еще ждать надо. - я поеду на Запорожце.
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38610254
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

работает <> корректно работает
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38610259
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosYUBA, работает <> корректно работаетПока корректно. Далее бум решать проблемы по мере их поступления. :)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38610337
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAВ моем случае лок не нужен.
Потому, что им занимается база данных. То есть не не нужен, а не нужно писать.
:-)
...
Рейтинг: 0 / 0
Многопоточность и разделяемые ресурсы.
    #38610479
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129YUBAВ моем случае лок не нужен.
Потому, что им занимается база данных. То есть не не нужен, а не нужно писать.
:-)Использование DataTable не обязательно подразумевает под собой взаимодействие с БД. Поэтому проблемы могут появиться.
...
Рейтинг: 0 / 0
72 сообщений из 72, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточность и разделяемые ресурсы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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