Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потокобезопасные строки в RAD 2009, Потокобезопасные строки 
V
    Опции темы
Platov
Дата 14.6.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Всем привет! Ребята, помогите мне глупому.
Пишу многопоточное приложение потоки создаются часто и по многу.
Валится зараза в самых непредвиденных местах. Грешу на AnsiString.
От передачи AnsiString в потоки я отказался. Передаю масивы char. Но между функциями передаю и возвращяю AnsiString. Внутри функций использую тоже его. Может быть проблема из-за этого?
Хотел переписать всё на std:: но он похоже тоже не на много лучше.

Посоветуйте пожалуйста как работать со строками (и с какими) в многопоточных приложениях. 

ps и вообще мне не понятно зачем придумывают ansistring и unicodestring если с ними нельзя работать  smile 
PM MAIL   Вверх
Alexeis
Дата 14.6.2013, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Я когда опасался за счетчик ссылок, то пользовал комовскую строку WideString . Есть еще метод Unique для того чтобы сделать счетчик ссылок на строку равным единице. 
  
Цитата(Platov @  14.6.2013,  14:36 Найти цитируемый пост)
ps и вообще мне не понятно зачем придумывают ansistring и unicodestring если с ними нельзя работать 

  Жаль что не придумали еще кнопку "Сделать все хорошо". Многопоточная работа не так тривиальна, чтобы ее автоматизировать. Следить нужно за тем что делаешь.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Platov
Дата 14.6.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Кажется нашёл причину. В потоках читал константу AnsiString. Это было единственное обращение к глобальной переменной, без критической секции. То что писать надо в критической секции - это мне понятно но почему при чтении ошибки?
PM MAIL   Вверх
Dem_max
Дата 14.6.2013, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexeis
Дата 14.6.2013, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(Platov @  14.6.2013,  16:48 Найти цитируемый пост)
 То что писать надо в критической секции - это мне понятно но почему при чтении ошибки? 

  Само по себе чтение потокобезопасно, но может получиться потоконебезопасная логика основная на чтении. Например есть 2 потока A и B. Оба выгребают данные из буфера. Буфер исчерпался настолько, что можно опустошить за одну итерацию. Оба потока почти одновременно прочитали  количество оставшихся элементов. И оба поняли, что есть что выгребать, однако поток A успел раньше, он заблокировал ресурс на запись и опустошил, после чего записал, что буфер пуст, но вот поток B продолжает думать, что данные еще есть, ведь чтение потокобезопасно, поэтому ему не запрещали читать состояние. Ресурс разблокирован и он лезет опустошать буфер и выходит за границы пытаясь вычесть несуществующие элементы. Так потокобезопасное чтение + потокобезопасная запись на пару могут оказаться не потокобезопасными. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Platov
Дата 16.6.2013, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Alexeis, Спасибо большое!
PM MAIL   Вверх
xvr
Дата 17.6.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Platov @  14.6.2013,  15:48 Найти цитируемый пост)
В потоках читал константу AnsiString.

Как именно читал? Если так -
Код

AnsiString a;

char b=a[1];
то это безопасно. А если так -
Код

AnsiString a;

AnsiString b=a;
то это делать нельзя. Несмотря на то, что a вроде только читается, на самом деле она модифицируется. Точнее увеличивается счетчик ссылок на тело строки внутри a

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.2208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.