Если кому интересно - вот краткая выдержка из ветки, надеюсь я сейчас ничего не нарушаю:
Потокобезопасен ли тип string?Пробегал2.... (13.12.08 22:21)
Подумалось вот тут... Всем известен тип string, известна его структура и свойства при копировании. Но предусмотрено ли в типе string потокобезопасность или он является таковым по своей структуре? Или он не потокобезопасный?
Допустим, где-то в программе имеем:
s1 := s2;
Далее s1 передается в один поток, а s2 в другой поток. Понятно, что при таком копировании реально s1 и s2 будут ссылаться на одну строку. Далее элементарный вариант, в первом потоке делается:
s3 := s1
в другом
s4 := s2
что если эти операции будут совершены в одно и тоже время? По идее счетчик ссылок должен быть увеличен на 2. Но в том же Рихтере наглядно показано как i:=i+1 одновременно в разных потоках может привести к результатам, отличным от увеличения i на 2. Или счетчик ссылок в string увеличивается с помощью InterlockedIncreament?
Можно еще кучу ситуаций придумать, я думаю...
В общем, я к чему - потокобезопасен ли "хитрый" тип string или нет? Если нет - для меня это станет неожиданностью и поводом задуматься. Раньше об этом даже не думал, я знал "хитрость" string'а, но работал всегда так, как будто s1 := s2 - получаются разные строчки, в принципе так и должно быть по задумке, реализация скрытая. Но что насчет многопоточности?
Городской Шаман (13.12.08 22:38)
> Пробегал2.... (13.12.08 22:21)
В VSC++ 6.0 не потокобезопасен, в 7.0 баг пофиксили. Зависит от реализации STL.
Ну или для Delphi зависит от реализации компилятора. Хотя в 7-рке безопасен.
Пробегал2.... (13.12.08 22:46)
Городской Шаман (13.12.08 22:38)
То есть, точно начиная с D7 стриги потокобезопасны? Ясно, спасибо.
Единственное, может хотелось бы официального подтверждения сего факта.
Городской Шаман (13.12.08 22:51)
> Пробегал2.... (13.12.08 22:46)
[4]>
> Городской Шаман (13.12.08 22:38)
[3]>
> То есть, точно начиная с D7 стриги потокобезопасны?
Может и более с ранними версиями они работают нормально. Но начиная с D7 они точно потокобезопасны.
Единственно что во время присваивания как string так и переменной любого другого типа лучше входить в критическую секцию, так как во время присваивания данные могут изменится, а после уже нет.
Игорь Шевченко © (13.12.08 23:24)
> Но предусмотрено ли в типе string потокобезопасность
Предусмотрена. Достаточно изучить system.pas