|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Имеется приложение в котором работают 3 потока - приложения и 2 дополнительных. Потоки читают одни и теже данные, включая данные, полученные другими потоками, но пишут в разные места, и, вроде, никакой конкуренции не было. Однако понадобилось, чтобы потоки обращались к одному и тому-же функционалу. Для определенности пусть это будет функция Код: c# 1. 2. 3. 4. 5. 6. 7.
Что будет если потоки обратятся к функции практически одновременно? Таким, например, образом 1-й - f(2,2,20), 2-й - f(3,3,10). 1. Все будет ОК, ведь обращаемся мы к Debug.WriteLine(""), и никаких конфликтов. 2. NET блокирует функцию до освобождения ресурсов и другому потоку придется подождать, и все опять ОК. 3. И тот и другой потоки получат и в итоге одинаковый ответ, например 6. В книжках днозначного ответа что-то не нашел - 50/50. "Есть многое на свете, друг Горацио, что и не сразу в голову придет." М. Твен "Приключения Геккельбери Финна" ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2014, 17:22 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAЧто будет если потоки обратятся к функции практически одновременно? Таким, например, образом 1-й - f(2,2,20), 2-й - f(3,3,10). 1ый уснет на 20мс и вернет 4, второй на 10 мс и вернет 6. С чего бы быть по-другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2014, 18:34 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, В вашем случае, если работа будет идти только с параметрами, переданными в функцию, то никаких проблем не будет. Функция - это выделенный кусок исполнимого кода, и его синхронизировать с чем то не нужно абсолютно. Синхронизируют, при необходимости, только доступ к данным. Например, передающиеся по ссылке объекты. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2014, 18:37 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Arm79 , Если прав Pallaris , и на время выполнения функции, она блокируется Фреймвоком, то никаких проблем не должно быть. Однако, в одной из книг, в качестве примера, разбирался доступ к функции именно в таком ключе, что и в моем вопросе. [quote Arm79 ]Функция - это выделенный кусок исполнимого кода,[/quote] и ее экземпляр не создается при исполнении. Если поток заходит в функцию и присваивает a=2, b=2, после чего второй поток заходит в нее-же и присваивает тем-же ячейкам памяти a=3, b=3, то первая функция на выходе return a+b получит 6, а не 2+2=4. Arm79 Синхронизируют, при необходимости, только доступ к данным. Например, передающиеся по ссылке объекты. Доступ к функции, как правило, и есть доступ к объектам и получение ссылки на объект. И что там происходит в объекте, далеко не всегда очевидно. Хорошо пусть будут данные, пусть при обращении к функции объекта мы должны получить коллекцию строк (Rows), а другой поток одновременно хочет получить некую другую коллекцию. Хотелось бы подчеркнуть, что потоки пишут данные в разные места, и здесь четко разделены, а вот читают одни и те-же, либо данные других потоков, но чтение идет в разном контексте. Т.е. обращаясь к одним и тем-же функциям объектов делают разные вызовы. Хотелось бы, чтобы Pallaris был прав, но где это четко прочитать? Если возможно, цитату с ссылкой. К сожалению, в Инете ищется все хуже и хуже. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2014, 22:24 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAчего второй поток заходит в нее-же и присваивает тем-же ячейкам памяти a=3, b=3 Осталось только понять, с чего вы взяли, что там те же ячейки? В вашем примере параметры метода - примитивные типы, следовательно, происходит передача по значению (а не по ссылке). Из чего следует, что каждый вызов метода приведет к копированию входных данных. То есть ячейки будут разными по любому. YUBAХотелось бы, чтобы Pallaris был прав Может, вы огорчитесь, но Pallaris прав. YUBAХотелось бы подчеркнуть, что потоки пишут данные в разные места, и здесь четко разделены, а вот читают одни и те-же, либо данные других потоков, но чтение идет в разном контексте. Т.е. обращаясь к одним и тем-же функциям объектов делают разные вызовы. Тут вообще ничего не понятно YUBAпусть при обращении к функции объекта мы должны получить коллекцию строк (Rows), а другой поток одновременно хочет получить некую другую коллекцию. А в чем вопрос то? Если функция создает в своем теле коллекцию строк (а не копирует откуда то), то эта коллекция никак не перемешается с другой ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2014, 23:49 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, YUBAК сожалению, в Инете ищется все хуже и хуже. :( гыгыгы Узбагойтесь, вернитесь к истокам : организация памяти, коль затронули функции - почитайте про стек вызовов (call stack) с такой кашей в голове дальше двигать нельзя (( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 00:10 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Arm79, Читаем Рихтера "... Net via C#" РихтерВ то же время FCL не гарантирует безопасности в отношении потоков экземплярным методам, так как введение в них запирающего кода слишком сильно сказывается на производительности. Более того, если каждый экземплярный метод начнет выполнять запирание и отпирание, все закончится тем, что в приложении в каждый момент времени будет исполняться только один поток, что еще больше снизит производительность. Как уже упоминалось, поток, конструирующий объект, является единственным, кто имеет к нему доступ. Другим потокам данный объект недоступен, а значит, при вызове экземплярных методов синхронизация не требуется. с. 855 Эт хорошо, что прав. И скорее всего прав. Но понимания физики процесса нет. Но получается, что при обращении к функции объекта из потока, должна создаваться полная копия объекта содержащего эту функцию и взаимосвязанных объектов. Ведь она, функция, может содержать множество других функций как самого объекта, так и других объектов, а те в свою очередь... до бесконечности. Такое предположение - это дурдом. Вряд-ли это возможно. Если это не так, никакое копирование переменных в вызове функции не поможет, да и копируются они в функцию (точки входа). Что мешает их значения изменить другому потоку? Т.е., для нашего примера a и b должны поменяться на с 2, 2 на 3,3 при обращении из другого потока. Копирование же значений переменных в вызываемую функцию безопасно только для вызывающего объекта, для чего, собственно и сделано. Но никакой гарантии, что копии кто-то не изменит и функция будет работать нештатно. Но Вы сами писали Arm79Функция - это выделенный кусок исполнимого кода Т.е.. видимо, для всех потоков, это одни и те же ячейки памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 00:45 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степи, я собственно и хочу разобраться. А про стек - каждый поток имеет свой стек. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 01:26 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
РихтерКогда поток конструирует новый объект при помощи оператора new, оператор возвращает ссылку на этот объект. Причем в этот момент ссылка имеется только у создающего объект потока, другие потоки не имеют к нему доступа. Если не передавать эту ссылку другому потоку, который может использовать объект одновременно с потоком, создавшим объект, необходимость в синхронизации отпадает. В моем случае все потоки работают с одними и теми же объектами и их методами. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 01:34 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, в твоем случае - это в каком? В том примере, что ты привел, нет никаких объектов, и при вызове метода все переменные a,b,x,y,z для любого из потоков - уникальные (находятся в разных ячейках памяти в момент выполнения) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 09:41 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAЧитаем Рихтера "... Net via C#" В том куске, который вы привели, смысла мало. Очевидно, это вырванные их контекста фразы. YUBAпри обращении к функции объекта из потока, должна создаваться полная копия объекта содержащего эту функцию и взаимосвязанных объектов это неверная фраза. YUBAЕсли это не так, никакое копирование переменных в вызове функции не поможет, да и копируются они в функцию (точки входа) это тоже какая то фантастика. причем ненаучная :-) YUBAКопирование же значений переменных в вызываемую функцию безопасно только для вызывающего объекта, для чего, собственно и сделано. Но никакой гарантии, что копии кто-то не изменит и функция будет работать нештатно. Вам Где-то в степи подсказал почитать про стек вызовов. Жаль, вы не следуете хорошим советам. YUBAArm79Функция - это выделенный кусок исполнимого кода Т.е.. видимо, для всех потоков, это одни и те же ячейки памяти. У вас какое то катастрофическое непонимание. Функция - это исполнимый код. То есть инструкции процессора. Алгоритм. Если 10 участников работают по одному алгоритму, из этого не следует, что они должны работать поочередно. Они вполне могут и работать параллельно. Синхронизировать их работу нужно только в том случае, если все участники используют какие-то общие для всех вещи. Например, если вы сколачиваете табуретку, как и ваши соседи на уроке труда, то при наличии своих инструментов вы не обязаны оглядываться на них. Но если у вас один молоток на класс, вам придется волей-неволей как-то становиться в очередь к нему. Конечно, мое описание сильно уступает Рихтеру, да и по хорошему это абстракция, на которую накладываются физические ограничения памяти и процессора, но на вашем уровне это не важно пока что. ОС и компилятор скроют от вас такие "мелочи". Да, повторюсь. Ячейки памяти - это данные. Метод - это инструкции. Они к данным отношения не имеют. Теперь на примере кода. Этот код всегда будет выдавать одни и те же результаты при тех же входных данных при любом количестве потоков, в которых метод будет вызываться. Потому что в x и y передаются копии значений. И связи с оригиналом нет. Код: c# 1. 2. 3. 4. 5.
а вот этот код нельзя назвать потокобезопасным, потому что параметр p передает ссылку на объект. А сам объект может изменяться одновременно с этим методом и в других местах. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 11:35 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Вот если бы было Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вот тогда бы начались проблемы при вызове из разных потоков Код: c# 1. 2.
т.к. переменные a и b будут общими для обоих потоков ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 11:41 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAих методами. А мне понятно, почему вы запутались. Слишком технически восприняли идею, что "методы находятся в классе". Значит типа надо создавать разные методы чтобы не пересекаться. Но тут классический обьектно ориентированный подоход "как бы" дает сбой - методы в процессе работы программы измениться не могут, и их сделали так, что физический код он один, а устроен так (с помощью стека и управления потоками) что может вызываться откуда угодно. Вы вобще знаете как работает процессор при переходе типа GOTO 555? Там есть регистр адреса, и вот при обычном проходе адрес просто увеличивается на единицу, а при прямом переходе - в регистр записывается 555 и следующая команда уже будет №555. То есть, по всей своей немаленькой памяти процессор перемещается мгновенно (за одну операцию). И это дает возможность свободно использовать общий участок кода (который где-то да, существует!) для всех экземпляров класса. А вот изменяемую часть - переменные, массивы переменных - это да, пишется в разное место для каждого нового экземпляра. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 12:25 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
PallarisВот если бы было Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вот тогда бы начались проблемы при вызове из разных потоков Код: c# 1. 2.
т.к. переменные a и b будут общими для обоих потоков А именно так, собственно и есть. Но, думаю, и в моем варианте хорошо не закончится. Вечером проведу натурный эксперимент. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 13:03 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA А именно так, собственно и есть. Зачем тогда голову морочишь неправильными примерами? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вечером проведу натурный эксперимент. Удачи ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 13:06 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAВечером проведу натурный эксперимент. Проведите лучше мысленный. Если бы для разделения того, что функция делает, программисту на языке высокого уровня приходилось бы заморачиваться проблемами низкого уровня - то уже давно бы это изменили. И уже давно изменили. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 13:12 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
D129YUBAих методами.Вы вобще знаете как работает процессор при переходе типа GOTO 555? Там есть регистр адреса, и вот при обычном проходе адрес просто увеличивается на единицу, а при прямом переходе - в регистр записывается 555 и следующая команда уже будет №555. То есть, по всей своей немаленькой памяти процессор перемещается мгновенно (за одну операцию). И это дает возможность свободно использовать общий участок кода (который где-то да, существует!) для всех экземпляров класса. А вот изменяемую часть - переменные, массивы переменных - это да, пишется в разное место для каждого нового экземпляра.Вообще знаю, и как процессор, и что есть стек, и что туда пишется. А еще и вышивать умею, на ассемблере раньше приходилось, и в машинных кодах тоже. Именно, отталкиваясь от низкого уровня, все больше полагаю, что 2+2=6. Если в NET MS что-то не придумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 13:21 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA в NET MS что-то не придумал. С++ писал не микрософт. Понятие "класс" тоже не их. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 15:10 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAВообще знаю, и как процессор, и что есть стек, и что туда пишется. не похоже ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 15:26 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, авторА про стек - каждый поток имеет свой стек. == сахар белый проведите мысленный эксперимент: В стеке вызовов замените вызов функции inline встройкой в вышестоящий стек у вас че поток загнется? хотя компилятор это делает на ура и даже по принуждению (AggressiveInlining). или передайте тело как аргумент Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
тут никто не будет бить по рукам за это.. все Ваши фобии вызывают улыбку с ассоциацией юноши, который подрочив боится заразиться триппером )) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 16:32 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Результаты натурного эксперимента. Код: 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.
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). Все, как видно, ОК. Каждый поток работает со своим образом функции. Тема исчерпана. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 16:58 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, YUBAсвоим образом функции Что такое "образ функции" ?) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 18:23 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
LelouchЧто такое "образ функции" ?)Образ - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств. Как конкретно это реализовано MS не имеет значения. Да, Всем Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 19:40 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBALelouchЧто такое "образ функции" ?)Образ - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств. кто на ком стоял?(с) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 19:55 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAОбраз - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств. Экземпляр метода - он всегда один в памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 20:30 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, YUBAКак конкретно это реализовано MS не имеет значения. МС это реализовало так, что у них всего 1 экземпляр метода в памяти, что вы там выдумали из своего "знания" машинных кодов © я даже представить боюсь ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 21:10 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
PallarisYUBAОбраз - описание, модель, копия и т.д., достаточное, для полного восстановления объекта и его свойств. Экземпляр метода - он всегда один в памяти.Понятия не имею, но каждый поток использует только и исключительно свои все переменные определенные в функции, что видно из распечатки вывода. И как MS это делает, копированием кода всех используемых функций, сохранением копии всех переменных в теле используемых потоком функций на время прерывания, либо переменные создаются в адресном пространстве потока, не ясно. Но нам нужен сам факт сего. Интересно еще и то, что функция не блокируется (как кто-то сказал), и может не конфликтуя выполняться одновременно несколькими потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:06 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, Вы вообще представляете что такое функция? интересно было бы услышать )) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:15 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAИнтересно еще и то, что функция не блокируется (как кто-то сказал). Самое интересное, что это ты и скзал, присовоив почему то мне ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:28 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAДоступ к функции, как правило, и есть доступ к объектам и получение ссылки на объект это просто вызов кода ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:36 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
PallarisСамое интересное, что это ты и сказал, присвоив почему то мнеЯ не помню кто. :) Ну, пусть я. Без разницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:44 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Ну ладно, уже флуд пошел. Все уже ясно. Тема исчерпана. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:45 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAЯ не помню кто. :) Ну, пусть я. Без разницы. тролль худосочный ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2014, 22:58 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 08:04 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 09:18 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
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.
и результат "вкусности" Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 10:05 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Alex Kuznetsov, да, спасибо. Ну, от переменных класса ничего другого ожидать и не приходится. Эт понятно. Меня Рихтер сильно заморочил - вот этим: РихтерВ то же время FCL не гарантирует безопасности в отношении потоков экземплярным методам, так как введение в них запирающего кода слишком сильно сказывается на производительности. У него еще есть рассуждения на эту тему. Там ни слова о переменных класса. Передача в функцию по ссылке или значению здесь тоже ни с какого бока. Что он подразумевает под отсутствием "гарантии безопасности в отношении потоков" именно "экземплярным методам", так и не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 17:43 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAЧто он подразумевает под отсутствием "гарантии безопасности в отношении потоков" именно "экземплярным методам", так и не понял. Ну это скорее товарищь Рихтер не понял, что нужно обьяснять, что подобная опасность касается только общих ресурсов, а не переменных в области видимости конкретной функции.... :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 19:21 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
D129, с общими ресурсами я решил просто, без всяких "запираний-отпираний". Данные, порожденные потоками, имеют временную метку, и измениться уже не могут. Другие потоки обращаются только к последней временной метке или более ранним. Все асинхронно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 21:19 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, гыгы авторДанные, порожденные потоками, имеют временную метку, и измениться уже не могут. Другие потоки обращаются только к последней временной метке или более ранним. Все асинхронно. что только не придумают русские, лишь бы не строить дороги..)))))))) зы я надеюсь это не в production ( так риторически) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 21:33 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степиУзбагойтесь, вернитесь к истокам : организация памяти, коль затронули функции - почитайте про стек вызовов (call stack) (( В качестве ликбеза поясни пожалуйста: почему аргументы вызова пушатся в стек раньше точки возврата в функцию вызова (ведь они попнутся в итоге позже, чем точка возврата, а должно быть наоборот по идее), и в какой момент в стек пушатся локальные переменные, и когда и кем они попаются оттуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 21:41 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степиYUBA, гыгы что только не придумают русские, лишь бы не строить дороги..)))))))) зы я надеюсь это не в production ( так риторически) Послушайте, Гыгы, вы когда нибудь вообще что-либо читали, кроме программирования? Или только "делать умный вид и надувать щеки"(с) ? В этом подходе ничего нового, применяется с момента рождения цифровой обработки. Так, кстати, я вообще не программист, и программирование для меня не более, чем вспомогательный инструмент. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 22:06 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Pallaris, аргуметны пишутся раньше перед вызовом call, просто перед ними идет переворот стека, не понял про локальные пишет хозяин кода, если это аргументы снаружи, там возможно укладка двух первых в регистр процессора минуя память ( обсуждали тут вроде) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 22:20 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAТак, кстати, я вообще не программист, и программирование для меня не более, чем вспомогательный инструмент. А почему тогда возмущаетесь удивлением профессиональных программистов непрофессиональному решению? YUBAДругие потоки обращаются только к последней временной метке или более ранним Вы учитываете, что тут тоже скорее всего будут нужны "отпирания/запирания"? Вероятно, если вы приведете пример РЕАЛЬНОЙ задачи, которую решаете, а не какие-то синтетические варианты, вам помогут более конкретно ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 22:39 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAAlex Kuznetsov, да, спасибо. Ну, от переменных класса ничего другого ожидать и не приходится. Эт понятно. Меня Рихтер сильно заморочил - вот этим: РихтерВ то же время FCL не гарантирует безопасности в отношении потоков экземплярным методам, так как введение в них запирающего кода слишком сильно сказывается на производительности. У него еще есть рассуждения на эту тему. Там ни слова о переменных класса. Передача в функцию по ссылке или значению здесь тоже ни с какого бока. Что он подразумевает под отсутствием "гарантии безопасности в отношении потоков" именно "экземплярным методам", так и не понял.Я считаю, что мой пример показывает именно то, что Рихтер и имел в виду. Методы экземпляра могут как работать с переменными класса, "внешними" по отношению к ним(методам), так и не работать с ними. Отсюда и нет гарантии безопасности без использования блокировок. Использование-же блокировок замедляет работу методов в силу вынужденного простоя во время ожидания снятия блокировки. По моему всё достаточно логично и понятно. Я считаю, что лучше в данном случае прибегнуть к Бритве Оккама и по возможности отказаться от использования разделяемых ресурсов, т.е. "внешних" по отношению к методу экземпляра переменных, при работе в многопоточной среде, дабы не замедлять работу блокировками. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 22:43 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степи просто перед ними идет переворот стека, O.O это что за чудо-операция такая? не понял про локальные Ну пишут в Вики, что стек может использоваться для хранения локальных переменных - только не пишут как и зачем (разве что при рекурсии?) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 22:50 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Pallaris, аргументы идут раньше вызова, после вызова происходит проброс результата в локальную переменную, ну может быть тут действительно не уместно переворот (stloc.0), вот про рекурсию не скажу, как бы логично разматывать стек без видимых локальных переменных но проброс всеравно скорее будет чисто техническии ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 23:30 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, да не прибедняйтесь, я то же уже пол года, и не собираюсь пока , скучно и не интересно. лучше бездельничать и лазить по спортзалам )) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 23:49 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Arm79YUBAДругие потоки обращаются только к последней временной метке или более ранним Вы учитываете, что тут тоже скорее всего будут нужны "отпирания/запирания"? Для чего? Все данные записываются в строки таблиц DataTable c ключевым полем [DateTime]. Выборка по View.RowFilter="DateTime <= '" + T + "'". Данные в строке больше не меняются. При готовности новых данных пишутся новые строки в таблицы с другим Т. Производящий поток сам решает какое время Т(n+1) >T(n) ему указать. А др потоки, какое время выбрать из <=Tn для обработки. Если нужных данных >T нет, ждем. Arm79Вероятно, если вы приведете пример РЕАЛЬНОЙ задачи, которую решаете, а не какие-то синтетические варианты, вам помогут более конкретноСпасибо, вопросов пока нет. Разве по методу Update, но это др. тема, и пока не к спеху. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2014, 23:50 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, а Вы с datatable без запираний работаете из потоков? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:02 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степиYUBA, а Вы с datatable без запираний работаете из потоков?Без. Потоки пишут в разные таблицы. Данные, пока полностью не записаны, недоступны для чтения. Флажок T в переменных. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:12 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, чето ничего не понял, если для каждого потока своя таблица, накой нам временная метка? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:20 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Точнее, не флажок, а "указатель" на последнее Т. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:23 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, а зачем он нужен, если у каждого потока своя таблица, то последняя запись есть последняя, и никто в эту таблицу ни вставит запись, кроме этого потока? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:27 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, боюсь вы совсем запутались. Вам самому не кажется, что связка поток + DataTable с какими-то метками + флаги - выглядит некошерно? Кстати, работа с БД в виде DataTable ныне не самая популярная технология, хотя есть тут её апологеты. Её вам тоже Рихтер рекомендовал? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:34 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, вообще использовать dt для таких дел имхо не рационально, даже если и потом есть желание перекинуть историю работы потоков в базу данных, это блядина занимает много места, да и дизпозе там у таблиц пустой.( вроде) лучше использовать для этого дела коллекции.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:43 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степиYUBA, чето ничего не понял, если для каждого потока своя таблица, накой нам временная метка?Свои таблицы. :) Чтобы потоки без проблем могли тянуть данные друг у друга, и выбирать предыдущие данные из таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:45 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степи, есть желание в дальнейшем в БД перекидывать. Во первых, в случае зависания можно начать с сохраненного уровня. :). Во вторых, м.б. эту лабуду придется еще обрабатывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 00:56 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, ну может я бы еще согласился что без монитора можно организовать это безобразие, но если они лазят друг к другу без монитора это чистое имхо вакханалия. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 01:01 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, авторВо первых, в случае зависания можно начать с сохраненного уровня. вообще то это называется в России пиз..ц, вот для этого и нужна тетенька или try catch что бы начать с сохраненного уровня ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 01:10 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степиYUBA, ну может я бы еще согласился что без монитора можно организовать это безобразие, но если они лазят друг к другу без монитора это чистое имхо вакханалия.В старые данные. В текущие дела друг друга они не лезут. Возьмем простенькую систему с обратной связью. Каждая из подсистем читает выход другой, и на этом основании формирует свой выход. И так до бесконечности. Форум, например, именно такая система. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 01:18 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степивообще то это называется в России пиз..ц, вот для этого и нужна тетенька или try catch что бы начать с сохраненного уровняВиндовз это называется. От него никакие try catch не помогают. Только сегодня в синий экран уходил вообще на пустом месте. И далее как ни в чем не бывало. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 01:29 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, У вас есть таблица, в которую поток пишет данные, есть другой поток который читает или делает выборку из этих данных данные лежат в виде коллекции datarow. Предположим что один поток выбирает данные из коллекции ( получил квант времени) в стеке указатель на коллекцию - выборка пошла аккумулятор копит значения, в этот момент квант истекает, весь этот стек пакуется во внутреннюю память потока и процессор отдается потоку на вставку , другой поток благополучно вставляет запись и заканчивает работу с таблицей процессор отдается потоку который был прерван, из него вытаскивается стек, который был прерван и задача продолжается. но перед продолжением задачи проверяется сохранность коллекции, если коллекция была модифицирована выбрасывается invalidoperationexception, тут какбы до фонаря что ищем старые или новые данные этож субьективно... это может и не вывалиться с первого раза или с десятого если итерации мелкие, что мешает поставить блокировку? две строчки кода ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 02:06 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степивот про рекурсию не скажу, как бы логично разматывать стек без видимых локальных переменных А где физически лежат локальные переменные? Когда под них резервируется память? Вот в этом случае: Код: c# 1. 2. 3. 4. 5.
переменная b - она резервируется в памяти до вызова, или во время выполнения? (без учета возможных оптимизаций непосредственной записи в регистр процессора) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 09:30 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Pallarisпеременная b - она резервируется в памяти до вызова, или во время выполнения? ( во время, точнее в так называемом прологе процедуры(функции, метода) сначала сохраняются регистры(список от соглашений конкретной среды зависит), устанавливается указатель стека (это и есть фактическое выделение памяти под локальные переменные) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 10:52 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Изопропил, т.е. в общем случае каждая локальная переменная со значением (или ссылка на нее) лежит в стеке вызова? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 11:44 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Где-то в степиYUBA, ... но перед продолжением задачи проверяется сохранность коллекции, если коллекция была модифицирована выбрасывается invalidoperationexception, тут какбы до фонаря что ищем старые или новые данные этож субьективно... это может и не вывалиться с первого раза или с десятого если итерации мелкие, что мешает поставить блокировку? две строчки кодаЗанялся этим вопросом. Такое может произойти, если работаем с коллекцией вообще. Например, foreach. Если же выбирается конкретика, мы получаем данные в виде "как есть". Исключений в этом случае не будет. Т.е. можно другим потоком даже писать в мои строки. Что мы там выберем, это другой ?, но выберется без проблем. В моем случае лок не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 13:00 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
Arm79YUBA, боюсь вы совсем запутались. Вам самому не кажется, что связка поток + DataTable с какими-то метками + флаги - выглядит некошерно?Эта часть порги уже работает. Arm79Кстати, работа с БД в виде DataTable ныне не самая популярная технология, хотя есть тут её апологеты. Её вам тоже Рихтер рекомендовал?Я не апологет. :) Но если под окном стоит Запорожец, а Мерседеса еще ждать надо. - я поеду на Запорожце. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 16:29 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBA, работает <> корректно работает ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 17:00 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
ViPRosYUBA, работает <> корректно работаетПока корректно. Далее бум решать проблемы по мере их поступления. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 17:02 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
YUBAВ моем случае лок не нужен. Потому, что им занимается база данных. То есть не не нужен, а не нужно писать. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 18:04 |
|
Многопоточность и разделяемые ресурсы.
|
|||
---|---|---|---|
#18+
D129YUBAВ моем случае лок не нужен. Потому, что им занимается база данных. То есть не не нужен, а не нужно писать. :-)Использование DataTable не обязательно подразумевает под собой взаимодействие с БД. Поэтому проблемы могут появиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2014, 21:08 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1403051]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
others: | 319ms |
total: | 489ms |
0 / 0 |