Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateThread && Strings [D7, Win2k, WinXP]


Страницы:   1 2

DillerXX ©   (2006-08-23 00:11:00) 

Как сделать так, чтобы в функции вызванной CreateThread все переменные типа String работли нормально и не вываливались порой с ошибками доступа к памяти :(


Пусик   (2006-08-23 19:24:00) [1]


> Суслик ©   (23.08.06 19:19) [38]
> > 37] Пусик ©   (23.08.06 19:11)ты исходный вопрос автора
> то видел?


Видела.
А ты знаешь логику работы со строками у автора?
Именно потому, что автор получает непредсказуемый результат, и достигается AV.


Суслик   (2006-08-23 19:19:00) [2]


> 37] Пусик ©   (23.08.06 19:11)

ты исходный вопрос автора то видел?


Пусик   (2006-08-23 19:11:00) [3]


> Суслик ©   (23.08.06 18:05) [24]
> Насколько я помню обсуждение, приведенное Дмитрием в качестве
> аргумента (я тогда тоже изрядно покопался в реализации строк),
>  то вывод был такой: строки потокобезопасны с точки зрения
> получения неожиданного AV, но естественно не потокобезопасны
> с точки зрения логики работы программы. Т.е. операции над
> строками есно не атомарные, но результат хоть какой-то от
> операции получен быдет (может быть не в полне ожидаемый)
> но без AV.Я тогда сам изрядно удивился этому факту.


Получение ожидаемого результата и естьпонятие потокобезопасного кода.
Если в начале операции ожидается один результат, а на выходе будет получен совершенно другой - о потокобезопасности говорить не приходится.


Пусик   (2006-08-23 19:05:00) [4]


> DiamondShark ©   (23.08.06 18:48) [35]
> Тогда балайка.


Даже операции с Integer не потокобезопасны. Что же говорить про строки.

if s1=s2 then- потокобезопасная операция?

s1 := s2, где s1 - глобальная, потокобезопасная операция?


> А если тебя интересует побыковать, то иди нафиг.


Сам дурак.


DiamondShark   (2006-08-23 18:48:00) [5]

Тогда балайка.


Суслик   (2006-08-23 18:38:00) [6]


> а если она уникальная, то с ней по-определению только один
> трид работает.

а если это глобальная переменная?


DiamondShark   (2006-08-23 18:34:00) [7]

а если она уникальная, то с ней по-определению только один трид работает.


Ketmar   (2006-08-23 18:32:00) [8]

> [31] DiamondShark ©   (23.08.06 18:26)
ну так ведь уникальных строк тоже есть. %-)


DiamondShark   (2006-08-23 18:26:00) [9]


> дошло до вызова диспетчера памяти, который её и переместил

Неуникальную строку не переместит.


DiamondShark   (2006-08-23 18:25:00) [10]


> Пусик ©   (23.08.06 17:34) [22]

Если тебя интересует именно разобраться -- читай system.pas, внимательно. Вспомни, что строки -- объекты со счётчиком ссылок, обрати внимание, что операции модификации "по месту" производятся только над уникальными (refcount=1) строками, обрати внимание, что подсчёт ссылок сериализован.

А если тебя интересует побыковать, то иди нафиг.


Ketmar   (2006-08-23 18:17:00) [11]

если побродить глубже, рано или поздно натыкаемся на вызов Move. которая есмь просто копирование куска пямяти. какого куска? ага, именно буфера строки (или его части). а теперь ситуация: адреса для копирования загружены, Move вызван, и тут... опа! строка "переехала" (где-то в другом месте таки дошло до вызова диспетчера памяти, который её и переместил). но Move-то об этом не знает. и радостно роет марсианский грунт...


Суслик   (2006-08-23 18:11:00) [12]

я смотрю на _LStrCat3 = сложение двух ansiстрок


Суслик   (2006-08-23 18:09:00) [13]

ты что конкретно имеешь в виду? какую функцию?


Ketmar   (2006-08-23 18:09:00) [14]

> [24] Суслик ©   (23.08.06 18:05)
ну ведь я только что генофонд смотрел. нет там защиты вокруг Move. нет, и всё. поэтому AV вполне может быть. другое дело, что не всегда, и даже не очень часто. %-)


Ketmar   (2006-08-23 18:06:00) [15]

> [23] guav ©   (23.08.06 18:02)
та же фигня, что и с Ansi, только счётчика нет. %-)


Суслик   (2006-08-23 18:05:00) [16]

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


guav   (2006-08-23 18:02:00) [17]

> DiamondShark ©

Обсжудались ли WideString строки ? потокобезопасны ли они ?


Пусик   (2006-08-23 17:34:00) [18]


> DiamondShark ©   (23.08.06 17:12) [21]
> > это может быть толтько в случае атомарности операции.Это
> заблуждение.


Где аргументы?


> см. GetMem.incпоиск по IsMultiThread


И что?


DiamondShark   (2006-08-23 17:12:00) [19]


> это может быть толтько в случае атомарности операции.

Это заблуждение.


> "...Дело в диспетчере памяти..." - тоже хотелось бы подробнее.

см. GetMem.inc
поиск по IsMultiThread


Пусик   (2006-08-23 17:01:00) [20]


> DiamondShark ©   (23.08.06 11:08) [5]
> > и если один из аргументов изменится в процесееИ? Они же
> copy-on-write.Нее... Строки тут ни при чём. Строки потокобезопасны,
>  обсуждали уже тут, с копанием в коде.Дело в диспетчере
> памяти.


"...строки потокобезопасны..." - это может быть толтько в случае атомарности операции.

"...Дело в диспетчере памяти..." - тоже хотелось бы подробнее.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо