
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (56) « Первая ... 32 33 [34] 35 36 ... 55 56 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#496
,
|
|
Твоя фантазия. Ну сам посуди, какая логика владения должна быть, скажем, у двусвязного списка?
|
Сообщ.
#497
,
|
|
|
Цитата Qraizer @ GC? Которого нет в C++, хотя вполне может быть. Ну сам посуди, какая логика владения должна быть, скажем, у двусвязного списка? ![]() |
Сообщ.
#498
,
|
|
|
Цитата applegame @ Цитата Qraizer @ GC? Которого нет в C++, хотя вполне может быть. Ну сам посуди, какая логика владения должна быть, скажем, у двусвязного списка? ![]() У D же C/C++'ый GC ![]() |
Сообщ.
#499
,
|
|
|
Цитата D_KEY @ Именно, и вроде даже был пропосал на GC. У D же C/C++'ый GC ![]() |
Сообщ.
#500
,
|
|
|
![]() |
Сообщ.
#501
,
|
|
А почему бы вместо указателя на (большие)данные не передавать указатель на функцию обработки в обратном направлении? Т.е. построить протокол взаимодействия потоков таким образом, чтобы обмен происходил исключительно маленькими порциями сообщений, которые можно тупо копировать и не париться ни над счётчиком ссылок, ни над потокобезопасностью (данные же иимутабельны в нашем обсуждении).
Да, чревато callback-hell, но ведь можно сделать это нормально. |
Сообщ.
#502
,
|
|
|
Цитата D_KEY @ Есть один большой массив иммутабельных данных, нужно обрабатывать его части параллельно множеством потоков. Если я передаю один и тот же элемент в несколько потоков, то тут либо голые указатели, либо shared_ptr.А ты мог бы привести какой-нибудь интересный пример? Задачку может какую. Цитата korvin @ Ну а указатель на иммутабельные данные разве не есть исключительно малая порция сообщений, которые можно тупо копировать и не париться ни над счётчиком ссылок, ни над потокобезопасностью? Кроме того у меня только несколько постоянно работающих потоков. Для обработки порций данных запускаются отдельные потоки. Они обрабатывают свой кусок и завершаются. Так как я использую D + vibe.d, то вместо потоков я применяю сущности очень похожие на goroutines.А почему бы вместо указателя на (большие)данные не передавать указатель на функцию обработки в обратном направлении? Т.е. построить протокол взаимодействия потоков таким образом, чтобы обмен происходил исключительно маленькими порциями сообщений, которые можно тупо копировать и не париться ни над счётчиком ссылок, ни над потокобезопасностью (данные же иимутабельны в нашем обсуждении). Первая версия была написана на Ruby + Celluloid, но из-за кривой архитектуры надо было все это переписать. От Ruby я отказался из-за динамической типизации. |
Сообщ.
#503
,
|
|
|
Цитата applegame @ нужно обрабатывать его части параллельно множеством потоков. Если я передаю один и тот же элемент в несколько потоков А зачем ты передаешь один и тот же элемент в разные потоки? Цитата то тут либо голые указатели, либо shared_ptr. Вообще, в этом примере скорее всего есть тот, кто собирает результат обработчиков и/или ждет их завершения. Вот он и является владельцем. Т.е. сначала владельцем является тот, кто инициирует обработку, а потом он передает владение тому, кто эту обработку ожидает/объединяет результаты и пр. |
Сообщ.
#504
,
|
|
|
Цитата D_KEY @ Ну а как иначе, если у меня есть скажем сто внешних наблюдателей, которые через RPC-интерфейс желают в любой момент времени прочитать состояние каких-то элементов массива?А зачем ты передаешь один и тот же элемент в разные потоки? Цитата D_KEY @ Владельцем является по сути массив данных. У никому передать владение он не может. Нет, unique_ptr тут явно не подходит. Вообще, в этом примере скорее всего есть тот, кто собирает результат обработчиков и/или ждет их завершения. Вот он и является владельцем. Т.е. сначала владельцем является тот, кто инициирует обработку, а потом он передает владение тому, кто эту обработку ожидает/объединяет результаты и пр. |
Сообщ.
#505
,
|
|
|
Цитата applegame @ Ну а как иначе, если у меня есть скажем сто внешних наблюдателей, которые через RPC-интерфейс желают в любой момент времени прочитать состояние каких-то элементов массива? Но в таком случае и GC не должен собрать этот массив, ведь в любой момент кто-то может запросить его по RPC. |
Сообщ.
#506
,
|
|
|
Цитата D_KEY @ Сам массив нет, а вот элементы да (точнее не сами элементы, а объекты на которые эти элементы ссылаются).Но в таком случае и GC не должен собрать этот массив, ведь в любой момент кто-то может запросить его по RPC. Массив меняется: какие-то элементы удаляются, новые добавляются. Скажем отдал я несколько элементов в поток обрабатывающий RPC-запрос. Пока запрос обрабатывается эти элементы были удалены из массива. Никаких сбоев не будет. Как только RPC-поток отработает ставшие ненужными элементы будут удалены GC. |
Сообщ.
#507
,
|
|
|
Цитата applegame @ Сам массив нет, а вот элементы да (точнее не сами элементы, а объекты на которые эти элементы ссылаются). А я подумал, что данные прямо в массиве лежат. Ок. Цитата Массив меняется: какие-то элементы удаляются, новые добавляются. Кем? Цитата Скажем отдал я несколько элементов в поток обрабатывающий RPC-запрос. Пока запрос обрабатывается эти элементы были удалены из массива. Никаких сбоев не будет. Ну shared_ptr вполне справится ![]() |
Сообщ.
#508
,
|
|
|
Цитата D_KEY @ Потоками-обработчиками. Операции чтения/записи в массив приходится синхронизировать мьютексом. Но они достаточно дешевые, так как копируются не сами объекты а только ссылки на них. И массив на самом деле не массив в смысле непрерывной области памяти. Там набор хэш-таблиц.Кем? Цитата D_KEY @ Зависит от нагрузки. Лично я в своем проекте ориентировался не на существенность оверхеда shared_ptr, даже если бы прибавилось скажем 10% я бы не переживал особо. Для меня было гораздо важнее удобство использования и безопасность. Хоть ты и сказал, что удобство - это субъективный параметр, но в данном случае он вполне объективный. Простое при прочих равных объективно удобнее сложного. Ну shared_ptr вполне справится ![]() |
Сообщ.
#509
,
|
|
|
Цитата applegame @ Операции чтения/записи в массив приходится синхронизировать мьютексом. Но при этом ты беспокоишься о копировании shared_ptr ![]() Цитата Для меня было гораздо важнее удобство использования и безопасность. Безопасность чего? Цитата Простое при прочих равных объективно удобнее сложного. Ты так говоришь, как будто "простое" и "сложное" - это объективные вещи ![]() Я вот не помню, чтобы shared_ptr мне когда-либо казался сложным. GC сам по себе гораздо сложнее, как и возможные случаи утечек при его использовании. |
![]() |
Сообщ.
#510
,
|
|
Мне кажется, applegame, ты смешал иммутабельность данных, подлежащих обработке, с иммутабельностью контейнера, их содержащего.
|