|
|
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Есть поле класса Код: pascal 1. к нему идет обращение из разных потоков на чтение и запись. Нужна ли мне при этом синхронизация? Или когда я записываю новое значение в строку, Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после, С уважением, Vasilisk ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 17:56 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
12.08.2019 17:56, _Vasilisk_ пишет: > Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после, интересно послушать, что скажут монстры рока. раскапывать какая там неонка у неё внутре - долго и муторно. имхо, лучше перебдеть, чем недобдеть. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:12 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Нужна ли мне при этом синхронизация? Нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:13 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey_Vasilisk_Нужна ли мне при этом синхронизация?Нужна.Тогда вопрос. Такой код Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. имеет право на существование? Или я должен писать так? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. По идее без UniqueString синхронизация не имеет смысла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:21 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:35 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
X-Cite, Это сейчас о чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:39 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Или я должен писать так? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. По идее без UniqueString синхронизация не имеет смысла Я всегда так пишу. Одной лишь CS недостаточно (вроде). В принципе, ошибки со строками довольно быстро отыскиваются, если сделать нагрузочный тест с несколькими потоками. Чем больше ядер у процессора, тем быстрее ошибка воспроизводится. От длины строки также может зависеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:51 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Насколько я помню, только чтение синхронизировать не требуется (счётчик и так синхронизируется). Синхронизация нужна в сценариях где присутствует запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 18:56 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeyтолько чтение синхронизировать не требуется (счётчик и так синхронизируется). Синхронизация нужна в сценариях где присутствует запись.А какой смысл синхронизации записи при несинхронизированном чтении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 19:00 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_А какой смысл синхронизации записи при несинхронизированном чтении? Kazantsev AlexeyСинхронизация нужна в сценариях где присутствует запись . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 19:08 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Вот, нашёл разъяснение от создателя: https://blog.therealoracleatdelphi.com/2015/11/friendly-reminder.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2019, 19:30 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Нужна ли мне при этом синхронизация? Или когда я записываю новое значение в строку, Delphi всегда выделяет новый кусок памяти и я никогда не прочитаю часть строки до присвоения и часть после Так со строками получиться не может благодаря copy-on-write, но синхронизация доступа к самой переменной таки нужна. Иначе, в отличии от случая с Integer кстати, геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV. UniqueString() не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 00:48 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Синхронизация нужна, unique не нужен Можно заморочиться с лок фри, но это сложно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 06:18 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
UniqueString() не нужен Лучше пусть будет. Мы же не знаем, какая работа со строкой будет в дальнейшем. А cs больше не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 07:03 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Голландец_Vasilisk_, Синхронизация нужна, unique не нужен +1 по мне lock лучше для каждой несвязной переменной с контролем времени жизни свой сделать, по типу плюсов. например, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. но мазохисты конечно встречаются везде... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 07:17 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Присвоение строк просто копирует указатель на один и тот же фрагмент памяти. Лок-анлок достаточно, если ты прям железно уверен, что сама строка не меняется. Но лучше добавить и копирование, если это не станет узким местом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 09:54 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Зачем копирование, если есть лок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 10:48 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Может меняться содержимое строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 12:05 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Логично же что может... Пока у вас обращение к переменной чтение/запись через блокировку то изменения строк управляемые.. Копирование тогда зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 12:16 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
X-CiteКопирование тогда зачем? Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 12:38 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
DmSerX-CiteКопирование тогда зачем? Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlock Вы не к строке обращаетесь, а к переменной. Выделите абстракцию (класс/ы), перенесите туда логику связанную со строкой.. в этой абстракции обеспечьте потокобезопасность и везде используйте ее.. Методы абстракции (классов) будут потокобезопасны, вызывайте где хотите... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 13:23 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
DmSerX-CiteКопирование тогда зачем? Чтобы не писать в дальнейшем при обращении к это строке Lock / Unlockа смысл? как уже написали выше, проблема при взятии строки увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочить а дальше строка защищена механизмом CopyOnWrite, если напрямую не лезть в память, то проблем с копией строки нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 13:54 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
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)увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочитьТакого быть не может. Изменение счетчика ссылок атомарная операция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 14:30 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ARGB32геттер может получить из другого потока строку, которая будет вот-вот разрушена и дальнейшее обращение к этой переменной приведет к AV.kealon(Ruslan)увеличение инкремента может не успеть и строку удалят в другом потоке, по-этому операции с "хранилищем" надо лочитьТакого быть не может. Изменение счетчика ссылок атомарная операция группа атомарных операций не атомарна Код: plaintext 1. 2. 3. т.е. при работе со строкой, interlocked функциями не обойтись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 15:13 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)т.е. при работе со строкой, interlocked функциями не обойтисьОни там и есть Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 15:16 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39848488&tid=2039144]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 456ms |

| 0 / 0 |
