LINUX.ORG.RU

perl ithreads, shared и загадочное изменение адресов


0

0

Пытаюсь использовать threads. Пока _никаких_ тредов я не порождаю. Все что я делаю -- это вставил в некоторых местах share. В очень ограниченном числе мест. Без этих share/shared все работает как часы.

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

Отладочная печать показывает, что до и после выполнения абсолютно безобидных строчек. Например таких: if (!defined($some_var))

адреса некоторых объектов _МЕНЯЮТСЯ_. Это происходит постоянно. Сами объекты не меняются.

КАКОГО ХРЕНА??

★★★★★

Gроблемы людей, закладывающихся на адреса при разработке на perl, авторов perl, очевидно, не волнуют ни в какой мере. Бо такими людьми должны заниматься врачи.

anonymous
()
Ответ на: комментарий от anonymous

Стрингификация референсов -- часть перла. Использование этих строк для идентификации объектов -- распространенная техника. Значит должны быть гарантии.

dilmah ★★★★★
() автор топика

> Отладочная печать показывает, что до и после выполнения абсолютно безобидных строчек. Например таких: if (!defined($some_var))

Безобидные строчки не при чем.  Если просто выполнить такой код:


  if (ref($expr) eq 'ARRAY')
  {
    warn "EEEaddr2.7 " . $expr->[1] . "\n";
  }
  if (ref($expr) eq 'ARRAY')
  {
    warn "EEEaddr2.8 " . $expr->[1] . "\n";
  }

то будут выданы 2 разных адреса.  Это при том что сам $expr не зашарен.

dilmah ★★★★★
() автор топика

лана:) я понял как обойти -- я адреса использовал для идентификации объектов. Можно для этой же цели использовать bless/ref

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> Стрингификация референсов -- часть перла. Использование этих строк для идентификации объектов распространенная техника.

Ээ... то что ссылка не есть строка (и о последствиях этого факта) есть как минимум в Perl Cookbook. А может и в туториале. FM, его таки полезно читать.

alexs
()

> адреса некоторых объектов _МЕНЯЮТСЯ_

Не специалист в perl, но возможно это отрабатывает GC?

kpanic ★★
()
Ответ на: комментарий от roy

ниче там трудного нет в шарении памяти! просто есть книга, с рецептами, там про шареную память несколько простых примеров(реально простых, я без выпендрежа говорю), разобравшись в которых за один день я спокойно юзаю эту шареную память. библиотека для шареной памяти есть IPC::Shareable она все и делает.

vilfred ☆☆
()
Ответ на: комментарий от kpanic

> Не специалист в perl, но возможно это отрабатывает GC?

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

Когда же я начинаю в некоторых местах добавлять shared/share то один и тот же объект меняет свой адрес. Я думаю перл таким образом пытатеся обеспечить атомарность -- он переписывает указатели.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

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

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

Опять же, не знаю какой GC применяется в perl, но во многих алгоритмах GC даже живые объекты могут менять адреса при уборке мусора. Но это возможно только в тех языках, где есть разница между указателем и целым и нету возможность свободно преобразовывать одно в другое.

kpanic ★★
()
Ответ на: комментарий от kpanic

> Опять же, не знаю какой GC применяется в perl

Подсчет ссылок.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.