powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Синхронизация при доступе к строке
25 сообщений из 46, страница 1 из 2
Синхронизация при доступе к строке
    #39848472
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть поле класса
Код: pascal
1.
FMessage: string


к нему идет обращение из разных потоков на чтение и запись.

Нужна ли мне при этом синхронизация? Или когда я записываю новое значение в строку, Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после,


С уважением, Vasilisk
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848476
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12.08.2019 17:56, _Vasilisk_ пишет:
> Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после,

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

раскапывать какая там неонка у неё внутре - долго и муторно.
имхо, лучше перебдеть, чем недобдеть.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848477
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Нужна ли мне при этом синхронизация?
Нужна.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848481
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey_Vasilisk_Нужна ли мне при этом синхронизация?Нужна.Тогда вопрос. Такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
  finally
    Unlock;
  end;
end;

имеет право на существование? Или я должен писать так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
    UniqueString(Result);
  finally
    Unlock;
  end;
end;


По идее без UniqueString синхронизация не имеет смысла
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848488
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
  finally
    Unlock;
  end;
end;
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848490
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Это сейчас о чем?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848494
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Или я должен писать так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function GetMessage: string;
begin
  Lock;
  try
    Result := FMessage;
    UniqueString(Result);
  finally
    Unlock;
  end;
end;


По идее без UniqueString синхронизация не имеет смысла

Я всегда так пишу. Одной лишь CS недостаточно (вроде). В принципе, ошибки со строками довольно быстро отыскиваются, если сделать нагрузочный тест с несколькими потоками. Чем больше ядер у процессора, тем быстрее ошибка воспроизводится. От длины строки также может зависеть.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848495
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Насколько я помню, только чтение синхронизировать не требуется (счётчик и так синхронизируется). Синхронизация нужна в сценариях где присутствует запись.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848497
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyтолько чтение синхронизировать не требуется (счётчик и так синхронизируется). Синхронизация нужна в сценариях где присутствует запись.А какой смысл синхронизации записи при несинхронизированном чтении?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848499
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_А какой смысл синхронизации записи при несинхронизированном чтении?

Kazantsev AlexeyСинхронизация нужна в сценариях где присутствует запись .
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848503
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, нашёл разъяснение от создателя: https://blog.therealoracleatdelphi.com/2015/11/friendly-reminder.html
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848563
ARGB32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_Нужна ли мне при этом синхронизация? Или когда я записываю новое значение в строку, Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после

Так со строками получиться не может благодаря copy-on-write, но синхронизация доступа к самой переменной таки нужна.
Иначе, в отличии от случая с Integer кстати, геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.
UniqueString() не нужен.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848582
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Синхронизация нужна, unique не нужен
Можно заморочиться с лок фри, но это сложно
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848584
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UniqueString() не нужен
Лучше пусть будет. Мы же не знаем, какая работа со строкой будет в дальнейшем. А cs больше не будет.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848585
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голландец_Vasilisk_,

Синхронизация нужна, unique не нужен
+1

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TSync<t> = record
private
  l: TSpinLock;
  v: t;
  function GetValue(): t;
  procedure SetValue(const A: t);
public
  property Value read GetValue write SetValue;
end;



но мазохисты конечно встречаются везде...
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848632
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присвоение строк просто копирует указатель на один и тот же фрагмент памяти. Лок-анлок достаточно, если ты прям железно уверен, что сама строка не меняется. Но лучше добавить и копирование, если это не станет узким местом.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848660
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем копирование, если есть лок?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848727
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может меняться содержимое строки.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848734
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логично же что может...
Пока у вас обращение к переменной чтение/запись через блокировку то изменения строк управляемые..
Копирование тогда зачем?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848746
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteКопирование тогда зачем?

Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlock
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848767
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerX-CiteКопирование тогда зачем?

Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlock
Вы не к строке обращаетесь, а к переменной.
Выделите абстракцию (класс/ы), перенесите туда логику связанную со строкой.. в этой абстракции обеспечьте потокобезопасность и везде используйте ее.. Методы абстракции (классов) будут потокобезопасны, вызывайте где хотите...
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848789
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerX-CiteКопирование тогда зачем?

Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlockа смысл?
как уже написали выше, проблема при взятии строки
увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочить

а дальше строка защищена механизмом CopyOnWrite, если напрямую не лезть в память, то проблем с копией строки нет
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848806
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyВот, нашёл разъяснение от создателя: https://blog.therealoracleatdelphi.com/2015/11/friendly-reminder.html авторJust like any other variable that is being read from or written to from many threads, string variables require the same level of protection as you would give to a simple Integer variable.Так извини, меня, если я Integer в одном потоке только читаю, а в другом только пишу, то и синхронизация мне не нужна. Мне не критично прочитать старое или новое значение

ARGB32геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.kealon(Ruslan)увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочитьТакого быть не может. Изменение счетчика ссылок атомарная операция
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848835
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ARGB32геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.kealon(Ruslan)увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочитьТакого быть не может. Изменение счетчика ссылок атомарная операция группа атомарных операций не атомарна

Код: plaintext
1.
2.
3.
mov eax, [v]
<-  если здесь произведут декремент в другом потоке, то в eax будет ссылка на убитый кусок
call _straddref



т.е. при работе со строкой, interlocked функциями не обойтись
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848838
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)т.е. при работе со строкой, interlocked функциями не обойтисьОни там и есть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function _UStrClr(var S): Pointer;
var
  P: PStrRec;
begin
  if Pointer(S) <> nil then
  begin
    P := Pointer(PByte(S) - SizeOf(StrRec));
    Pointer(S) := nil;
    if P.refCnt > 0 then
    begin
      if AtomicDecrement(P.refCnt) = 0 then
        FreeMem(P);
    end;
  end;
  Result := @S;
end;
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Синхронизация при доступе к строке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]