Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

CreateThread && Strings   Найти похожие ветки 

 
DillerXX ©   (2006-08-23 00:11) [0]

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


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

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


 
DiamondShark ©   (2006-08-23 01:05) [2]

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


 
DiamondShark ©   (2006-08-23 01:07) [3]


> SysUtils.BeginThread

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


 
Ketmar ©   (2006-08-23 01:30) [4]

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


 
DiamondShark ©   (2006-08-23 11:08) [5]


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

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

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


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


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


Бред.


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

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


 
Ketmar ©   (2006-08-23 16:07) [8]

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


 
DiamondShark ©   (2006-08-23 16:15) [9]


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

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


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


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


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


 
Ketmar ©   (2006-08-23 16:33) [11]

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


 
DiamondShark ©   (2006-08-23 16:34) [12]


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

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


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


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


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

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


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


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


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


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


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


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


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

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

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


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


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

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


 
DiamondShark ©   (2006-08-23 16:50) [18]


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

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


 
Ketmar ©   (2006-08-23 16:56) [19]

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


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


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


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

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


 
DiamondShark ©   (2006-08-23 17:12) [21]


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

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


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

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


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


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


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


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


И что?


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

> DiamondShark ©

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


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

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


 
Ketmar ©   (2006-08-23 18:06) [25]

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


 
Ketmar ©   (2006-08-23 18:09) [26]

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


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

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


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

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


 
Ketmar ©   (2006-08-23 18:17) [29]

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


 
DiamondShark ©   (2006-08-23 18:25) [30]


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

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

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


 
DiamondShark ©   (2006-08-23 18:26) [31]


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

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


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

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


 
DiamondShark ©   (2006-08-23 18:34) [33]

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


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


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

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


 
DiamondShark ©   (2006-08-23 18:48) [35]

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


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


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


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

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

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


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


Сам дурак.


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


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


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


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


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

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


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


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


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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.052 c
10-1123268291
Michael5
2005-08-05 22:58
2006.09.10
Как задать ширину столбца в Excel?


15-1155709272
Term
2006-08-16 10:21
2006.09.10
Приложение под .NET


5-1138111947
Creative
2006-01-24 17:12
2006.09.10
обработчик onKeyDown


4-1147274009
suharew
2006-05-10 19:13
2006.09.10
чтение из COM порта


2-1155816088
fast2
2006-08-17 16:01
2006.09.10
Как сделать, чтоб при нажатии на Enter, не зависимо от того, где





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский