Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки. Нужна ли синхронизация? [D6, XP]


Страницы:   1 2 3 4 5 6 7

vint45 ©   (2008-06-17 12:42:00) 

Здраствуйте. Есть приложение, в котором выполняются несколько потоков. Каждый поток имеет свой локальный набор переменных. Требуется периодически считывать из главного потока значения некоторых локальных переменных этих потоков (сбор статданных, для последующего отображения статистики на экране).
Вопрос. Надо ли помещать в критическую секцию процесс чтения локальных переменных главным потоком из остальных потоков?
ps прочитал пару статей по потокам, но там в основном рассматриваются варианты, когда потоки пытаются изменять, а не читать общие переменные.


Игорь Шевченко   (2008-06-19 16:12:00) [41]

Тын-Дын ©   (19.06.08 16:10) [94]


> Нужно разжевывать?


Меня не интересует пример [76], меня интересует пример [80]. Нефигово бы разжевать


Тын-Дын   (2008-06-19 16:12:00) [42]


> MsGuns ©   (19.06.08 16:10) [95]
> Из пустого в порожнее ;(


Сергей, ты тоже посмотри реально и непредвзято на пример в [76].
При необходимости получения нескольких связанных переменных из другого потока необходима синхронизация.


Игорь Шевченко   (2008-06-19 16:11:00) [43]

Демонстрационный пример с AV приветствуется...


MsGuns   (2008-06-19 16:10:00) [44]

Из пустого в порожнее ;(


Тын-Дын   (2008-06-19 16:10:00) [45]


> Игорь Шевченко ©   (19.06.08 16:07) [89]
> Тын-Дын ©   (19.06.08 16:04) [84]
>
> Мой пример отражает только мой пример [64] и ничего более.
>  В [70] ты ответил: "Не супер-пупер, а обычная синхронизация
> требуется."
> Вот просьба пояснить мне и остальным участникам, какого
> рода синхронизация требуется и зачем ?


Из примера в [76] разве не видно? Нужно разжевывать?


Игорь Шевченко   (2008-06-19 16:10:00) [46]

Тын-Дын ©   (19.06.08 16:09) [92]

И чего ? Где AV ?


Тын-Дын   (2008-06-19 16:09:00) [47]


> пусть он пишет по 32 бита


Один поток пишет int64, в это время второй читает. 32 бита от старого значения, 32 - от нового.


DVM   (2008-06-19 16:09:00) [48]


> Игорь Шевченко ©   (19.06.08 16:05) [86]


> что значит "перезаписаны некоторые байты" ?

Вторичный поток начал запись нового значения, скажем в 4-х байтовое число, записал только 2 байта и управление было передано основному потоку, который считал два старых байта и 2 новых. Или такое невозможно?


Игорь Шевченко   (2008-06-19 16:08:00) [49]


> интересно, Int64 пишет срзу 8 байт? На всех процессорах?
>  Всегда?


пусть он пишет по 32 бита


DVM   (2008-06-19 16:07:00) [50]


> Корректное-ли?

А почему нет? Область памяти зарезервирована под это число, там лежат какие-то прошлые данные представляющие собой число, часть байт перезаписывается, но все равно по данному адресу продолжает лежать число.


> И не AV-ли получим?

Не, не получим. Хотя можно попробовать смоделировать ситуацию.


Игорь Шевченко   (2008-06-19 16:07:00) [51]

Тын-Дын ©   (19.06.08 16:04) [84]

Мой пример отражает только мой пример [64] и ничего более. В [70] ты ответил: "Не супер-пупер, а обычная синхронизация требуется."
Вот просьба пояснить мне и остальным участникам, какого рода синхронизация требуется и зачем ?


Тын-Дын   (2008-06-19 16:06:00) [52]


> весли чтение происходит в процессе записи числа, то как
> в этом можно быть уверенным



> Интересно, каким образом можно получить AV ?


интересно, Int64 пишет срзу 8 байт? На всех процессорах? Всегда?


Игорь Шевченко   (2008-06-19 16:05:00) [53]

DVM ©   (19.06.08 15:58) [82]


> В данном случае, действительно, даже если будет перезаписаны
> только некоторые байты числа


что значит "перезаписаны некоторые байты" ?

Тын-Дын ©   (19.06.08 16:03) [83]


> весли чтение происходит в процессе записи числа, то как
> в этом можно быть уверенным? И не AV-ли получим?


Интересно, каким образом можно получить AV ?


Тын-Дын   (2008-06-19 16:05:00) [54]

+ к тому:
С чего ты взял, что получить необходимо только одну переменную?


Тын-Дын   (2008-06-19 16:04:00) [55]


> Игорь Шевченко ©   (19.06.08 15:56) [81]
>
> > Я на [75] в [76] ответил.
>
>
> нет, извини, ты ответил на нечто иное.


Почему ты считаешь, что твой пример отражает авторский вопрос и более точен?
К тому же см. [83]. Как раз тут и возможно разрушение данных.


Тын-Дын   (2008-06-19 16:03:00) [56]


> В данном случае, действительно, даже если будет перезаписаны
> только некоторые байты числа, главным будет считано корректное
> число


Корректное-ли? весли чтение происходит в процессе записи числа, то как в этом можно быть уверенным? И не AV-ли получим?


DVM   (2008-06-19 15:58:00) [57]


> Какие тут могут быть разрушенные данные ?

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

Но так только в этом конкретном случае.


Игорь Шевченко   (2008-06-19 15:56:00) [58]

Тын-Дын ©   (19.06.08 15:52) [78]

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

качающий поток:
type
 size_t = int64;

 TDownloadThread = class(TThread)
 private
   FTotalSize: size_t;
   FCurrentSize: size_t;
.........
 public
   property TotalSize: size_t read FTotalSize;
   property CurrentSize: size_t read FCurrentSize;
.......
 end;

меняется в процессе загрузки, сам понимаешь, только FCurrentSize;


Игорь Шевченко   (2008-06-19 15:56:00) [59]


> Я на [75] в [76] ответил.


нет, извини, ты ответил на нечто иное.


Тын-Дын   (2008-06-19 15:53:00) [60]


>
> Просьба на [75] ответить


Я на [75] в [76] ответил.


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо