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 работли нормально и не вываливались порой с ошибками доступа к памяти :(


Ketmar   (2006-08-23 16:56:00) [21]

> [18] DiamondShark ©   (23.08.06 16:50)
а так, что на вход Move передаётся адрес старого буфера строки. после чего строка благополучно переезжает в новое место. и тут начинается бедлам.


DiamondShark   (2006-08-23 16:50:00) [22]


> Ketmar ©   (23.08.06 16:46) [16]

Ну и как это вызовет ошибки доступа к памяти? При условии, конечно, что МП сериализован.


DiamondShark   (2006-08-23 16:47:00) [23]


> Если DiamondShark приведет тезисы в пользу атомарности операции
> присваивания

С большим удовольствием. Но только когда увижу цитату, где я бы нечто подобное утверждал.


Ketmar   (2006-08-23 16:46:00) [24]

> [12] DiamondShark ©   (23.08.06 16:34)
а это абсолютно не важно. см, например, исходник _LStrCat.
       CALL    _LStrSetLength
       MOV     EAX,ESI
       MOV     ECX,[ESI-skew].StrRec.length

всё. приехали. тот же подход в самой _LStrSetLength и т.п. т.е. строки никак не защищены. никаких блокировок и подобного. вот это: s := s0+s1;генерирует просто вызов _LStrCat3, где тоже никаких защит.


Пусик   (2006-08-23 16:45:00) [25]


> Не заморачивайся, мужики просто ударились в абстрактную
> полемику)..


Ну полемика полемикой, а истина - истиной.
Если DiamondShark приведет тезисы в пользу атомарности операции присваивания, я приведу конкретный пример с противоположными результатами, который сейчас передо мной.


Пусик   (2006-08-23 16:43:00) [26]


> Ketmar ©   (23.08.06 16:33) [11]
> > [9] DiamondShark ©   (23.08.06 16:15)другим потоком. вот
> случилось у него в это время странное. да, перераспределение
> памяти строки и изменения полей -- атомарные.


Даже операция s := s1 не атомарная.


Сергей М.   (2006-08-23 16:42:00) [27]


> Пусик ©   (23.08.06 16:19) [10]


Не заморачивайся, мужики просто ударились в абстрактную полемику)..

А автор облажался на незнании отличий между BeginThread и CreateThread в плане сериализации обращений к памяти со стороны BMM)


DiamondShark   (2006-08-23 16:34:00) [28]


> Ketmar ©   (23.08.06 16:33) [11]

Конкретнее. Оператор языка, изменяющий строку.


Ketmar   (2006-08-23 16:33:00) [29]

> [9] DiamondShark ©   (23.08.06 16:15)
другим потоком. вот случилось у него в это время странное. да, перераспределение памяти строки и изменения полей -- атомарные. а "+" -- нет. что я и пытаюсь пояснить. и вот такие штуки могут породить "баги-привидения".


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


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


Можешь итоговый тезис-подтверждение своего высказывания из той ветки привести?


DiamondShark   (2006-08-23 16:15:00) [31]


> после чего sa радостно меняется

каким образом?


Ketmar   (2006-08-23 16:07:00) [32]

> [5] DiamondShark ©   (23.08.06 11:08)
Дим, вот это: s := 'abc';-- да, потокобезопасно. а вот это: s := sa+sb;-- нет. потому что, хотя изменения в sa и sb -- да, потокобезопасны, но сама операция "+" -- ни разу. смотри: берём длину и адрес sa, например. после чего sa радостно меняется с перераспределением памяти. и операция копирования копирует марсианский грунт.


Пусик   (2006-08-23 14:36:00) [33]

прошу прощения за резкость, но в [5] - чушь.


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


> Нее... Строки тут ни при чём. Строки потокобезопасны, обсуждали
> уже тут, с копанием в коде.


Бред.


DiamondShark   (2006-08-23 11:08:00) [35]


> и если один из аргументов изменится в процесее

И? Они же copy-on-write.

Нее... Строки тут ни при чём. Строки потокобезопасны, обсуждали уже тут, с копанием в коде.
Дело в диспетчере памяти.


Ketmar   (2006-08-23 01:30:00) [36]

> [2] DiamondShark ©   (23.08.06 01:05)
не, Дим, толькоэто не поможет. например, та же concat() -- всё равно операция не атомарная. и если один из аргументов изменится в процесее... грустно будет.


DiamondShark   (2006-08-23 01:07:00) [37]


> SysUtils.BeginThread

System.BeginThread, разуммеется.


DiamondShark   (2006-08-23 01:05:00) [38]

Либо создавать потоки функцией SysUtils.BeginThread, либо перед созданием потоков присвоить System.IsMultiThread := true


Ketmar   (2006-08-23 00:21:00) [39]

делать синхронизацию. например, критическими секциями. или не использовать переменные в нескольких потоках одновременно.


Страницы:   1 2

Наверх

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