powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Синхронизация при доступе к строке
21 сообщений из 46, страница 2 из 2
Синхронизация при доступе к строке
    #39848839
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
thred1:
mov eax, [v]

thred2:
 _UStrClr [v]

thred1:
call _straddref



что будет?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848841
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Код: plaintext
1.
mov eax, [v]

Это что?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848849
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_там и есть

Руки бы оторвать тому, что ЭТО написал...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848870
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_если я Integer в одном потоке только читаю, а в другом только пишу, то и синхронизация мне не нужна. Мне не критично прочитать старое или новое значение
Для Integer не нужна, но изменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памяти. Тест просто пишется, проверь.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848878
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyМожет получится так, что прочитаешь указатель на освобождённый блок памяти.

Это бы ещё ладно, а вот прочитать указатель на освобождённый и заново выделенный блок даст
реально забавные спецэффекты и снос крыши при попытке отладки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848929
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyизменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памятиТ.е. кроме лока нужна еще и UniqueString?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848931
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРуки бы оторвать тому, что ЭТО написал...Что-то не вижу. В чем криминал?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848937
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Kazantsev Alexeyизменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памятиТ.е. кроме лока нужна еще и UniqueString?нет, если у тебя уже есть валидная строка, неважно сколько на неё "копий", работа с ней будет корректна


_Vasilisk_Это что?копирование в регистр из участка памяти, куда идёт совместный доступ
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848940
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Kazantsev AlexeyТ.е. кроме лока нужна еще и UniqueString?
Нет.
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848943
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_В чем криминал?

Строка "if P.refCnt > 0 then" совершенно тут бесполезна и только вводит в заблуждение. К
моменту её выполнения refCnt в многопоточном приложении должен быть либо больше единицы,
либо приходит пушной зверёк. (Приложение в котором только один поток использует эту
переменную считается за однопоточное.)

Таким образом эта процедура построена на предположении, что вся остальная compiler magic
работает корректно, а на уровне приложения обращение к переменной таки синхронизировано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848953
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСтрока "if P.refCnt > 0 then" совершенно тут бесполезна и только вводит в заблуждение. К моменту её выполнения refCnt в многопоточном приложении должен быть либо больше единицы, Нет. Для констант refCnt -1 и не изменяется
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
procedure _UStrAsg(var Dest: UnicodeString; const Source: UnicodeString); // globals (need copy)
{$IFDEF PUREPASCAL}
var
  S, D: Pointer;
  P: PStrRec;
  Len: LongInt;
begin
  S := Pointer(Source);
  if S <> nil then
  begin
    if __StringRefCnt(Source) < 0 then   // make copy of string literal
    begin
      Len := __StringLength(Source);
      S := _NewUnicodeString(Len);
      Move(Pointer(Source)^, S^, Len * SizeOf(WideChar));
    end else
    begin
      P := PStrRec(PByte(S) - SizeOf(StrRec));
      AtomicIncrement(P.refCnt);
    end;
  end;
  D := Pointer(Dest);
  Pointer(Dest) := S;
  _UStrClr(D);
end;
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848959
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я совсем потерялся. Давайте еще раз. string это указатель на структуру
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  StrRec = packed record
  {$IF defined(CPUX64)}
    _Padding: LongInt; // Make 16 byte align for payload..
  {$ENDIF}
    codePage: Word;
    elemSize: Word;
    refCnt: Longint;
    length: Longint;
    data: array[0...] of Char;
  end;

codePage и elemSize модифицироваться не могут refCnt модифицируется атомарно length и data не модифицируются логикой программы. Новая строка только присваивается. Без всякого сложений и модификаций символов.

Т.е. из всей структуры модифицируется только одно поле refCnt и то происходит атомарно. Зачем здесь синхронизация?

Далее, допустим, синхронизация нужна, но не нужна UniqueString. Тогда я вообще не понимаю. Код
_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.
11.
12.
FMessage: Pointer;
....
function GetMessage: Pointer;
begin
  Lock;
  try
    AddRef(FMessage)
    Result := FMessage;
  finally
    Unlock;
  end;
end;

Но тогда любой код, вызвавший GetMessage получает тот же указатель, что и оригинальный FMessage, но уже ни о какой синхронизации не подозревает. Тогда в чем смысл был Lock/Unlock, если AddRef атомарна?
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848961
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

потому что

Код: pascal
1.
Result := FMessage;

это две операции: нужно сначала получить указатель на структура StrRec, а потом уже вызвать инкремент, и наоборот это принципиально не сделать
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848965
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Для констант refCnt -1 и не изменяется

Эва какие костыли...

В любом случае, когда этот код параллельно выполняется для refCnt = 1, наступает "Бум!"
поскольку один поток затормозил перед проверкой, второй в это время полностью выполнил
процедуру и освободил память, первый прочухался и проверяет refCnt в уже освобождённом
мусоре. А для глобальной переменной счётчик будет 1 без вариантов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848976
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)это две операции: нужно сначала получить указатель на структура StrRec, а потом уже вызвать инкрементВсе. Уразумел. Извините за торможение
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39848978
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovпоскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память,Нет. Декремент вызывается только при потере видимости. Если мы говорим о доступе к одной переменной из разных потоков, значит эта переменная не локальная, а, как минимум, поле класса. А значит видимость она потеряет только при вызове деструктора.

Если же у нас два указателя на одну строку, то уже refCnt >= 2
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849024
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Dimitry Sibiryakovпоскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память,Нет. Декремент вызывается только при потере видимости. Если мы говорим о доступе к одной переменной из разных потоков, значит эта переменная не локальная, а, как минимум, поле класса. А значит видимость она потеряет только при вызове деструктора.

Если же у нас два указателя на одну строку, то уже refCnt >= 2 только читать наверное не особо интересно, надо наверное и писать - 21948221
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849304
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)только читать наверное не особо интересно, надо наверное и писать - 21948221 Так мы же договорились, что доступ к переменной только через синхронизацию
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849334
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Dimitry Sibiryakov тебе объяснял, что будет без лока
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849353
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dimitry Sibiryakov тебе объяснял, что будет без локаДмитрий возмущался кривизной кода RTL. Я попросил показать в чем кривизна.

Кроме того, обсуждаемый код RTL влияет на объекты "строка", а не на строковые переменные (которые указатели на эти объекты)
...
Рейтинг: 0 / 0
Синхронизация при доступе к строке
    #39849362
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_обсуждаемый код RTL влияет на объекты "строка", а не на строковые переменные (которые
указатели на эти объекты)

Благодаря магии компилятора они "умные" указатели, что несколько изменяет картину.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Синхронизация при доступе к строке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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