|
|
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. что будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 15:19 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) Код: plaintext 1. Это что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 15:21 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_там и есть Руки бы оторвать тому, что ЭТО написал... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 15:29 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_если я Integer в одном потоке только читаю, а в другом только пишу, то и синхронизация мне не нужна. Мне не критично прочитать старое или новое значение Для Integer не нужна, но изменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памяти. Тест просто пишется, проверь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 16:12 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyМожет получится так, что прочитаешь указатель на освобождённый блок памяти. Это бы ещё ладно, а вот прочитать указатель на освобождённый и заново выделенный блок даст реально забавные спецэффекты и снос крыши при попытке отладки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 16:20 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeyизменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памятиТ.е. кроме лока нужна еще и UniqueString? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 17:25 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovРуки бы оторвать тому, что ЭТО написал...Что-то не вижу. В чем криминал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 17:25 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Kazantsev Alexeyизменение строковой переменной, как уже сказали, операция не атомарная. Может получится так, что прочитаешь указатель на освобождённый блок памятиТ.е. кроме лока нужна еще и UniqueString?нет, если у тебя уже есть валидная строка, неважно сколько на неё "копий", работа с ней будет корректна _Vasilisk_Это что?копирование в регистр из участка памяти, куда идёт совместный доступ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 17:32 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Kazantsev AlexeyТ.е. кроме лока нужна еще и UniqueString? Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 17:39 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_В чем криминал? Строка "if P.refCnt > 0 then" совершенно тут бесполезна и только вводит в заблуждение. К моменту её выполнения refCnt в многопоточном приложении должен быть либо больше единицы, либо приходит пушной зверёк. (Приложение в котором только один поток использует эту переменную считается за однопоточное.) Таким образом эта процедура построена на предположении, что вся остальная compiler magic работает корректно, а на уровне приложения обращение к переменной таки синхронизировано. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 17:41 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 18:22 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Что-то я совсем потерялся. Давайте еще раз. string это указатель на структуру Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. codePage и elemSize модифицироваться не могут refCnt модифицируется атомарно length и data не модифицируются логикой программы. Новая строка только присваивается. Без всякого сложений и модификаций символов. Т.е. из всей структуры модифицируется только одно поле refCnt и то происходит атомарно. Зачем здесь синхронизация? Далее, допустим, синхронизация нужна, но не нужна UniqueString. Тогда я вообще не понимаю. Код _Vasilisk_ Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. по сути идентичен такому Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Но тогда любой код, вызвавший GetMessage получает тот же указатель, что и оригинальный FMessage, но уже ни о какой синхронизации не подозревает. Тогда в чем смысл был Lock/Unlock, если AddRef атомарна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 18:39 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, потому что Код: pascal 1. это две операции: нужно сначала получить указатель на структура StrRec, а потом уже вызвать инкремент, и наоборот это принципиально не сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 18:43 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Для констант refCnt -1 и не изменяется Эва какие костыли... В любом случае, когда этот код параллельно выполняется для refCnt = 1, наступает "Бум!" поскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память, первый прочухался и проверяет refCnt в уже освобождённом мусоре. А для глобальной переменной счётчик будет 1 без вариантов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 18:55 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)это две операции: нужно сначала получить указатель на структура StrRec, а потом уже вызвать инкрементВсе. Уразумел. Извините за торможение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 19:33 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovпоскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память,Нет. Декремент вызывается только при потере видимости. Если мы говорим о доступе к одной переменной из разных потоков, значит эта переменная не локальная, а, как минимум, поле класса. А значит видимость она потеряет только при вызове деструктора. Если же у нас два указателя на одну строку, то уже refCnt >= 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 19:40 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Dimitry Sibiryakovпоскольку один поток затормозил перед проверкой, второй в это время полностью выполнил процедуру и освободил память,Нет. Декремент вызывается только при потере видимости. Если мы говорим о доступе к одной переменной из разных потоков, значит эта переменная не локальная, а, как минимум, поле класса. А значит видимость она потеряет только при вызове деструктора. Если же у нас два указателя на одну строку, то уже refCnt >= 2 только читать наверное не особо интересно, надо наверное и писать - 21948221 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2019, 23:57 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)только читать наверное не особо интересно, надо наверное и писать - 21948221 Так мы же договорились, что доступ к переменной только через синхронизацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2019, 15:25 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Dimitry Sibiryakov тебе объяснял, что будет без лока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2019, 16:08 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dimitry Sibiryakov тебе объяснял, что будет без локаДмитрий возмущался кривизной кода RTL. Я попросил показать в чем кривизна. Кроме того, обсуждаемый код RTL влияет на объекты "строка", а не на строковые переменные (которые указатели на эти объекты) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2019, 16:34 |
|
||
|
Синхронизация при доступе к строке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_обсуждаемый код RTL влияет на объекты "строка", а не на строковые переменные (которые указатели на эти объекты) Благодаря магии компилятора они "умные" указатели, что несколько изменяет картину. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2019, 16:44 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39848961&tid=2039144]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
137ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 414ms |

| 0 / 0 |
