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

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

ThreadSafe доступ к переменным [D7, WinXP]


iPod ©   (2004-08-10 13:09:00) 

Будет ли потокобезопасно обращение к глобальным переменным в основном потоке из него же, при условии, что множество дочерних потоков также обращаются к этим переменным синхронизированно?


jack128   (2004-08-10 15:27:00) [1]


> Для каждого участка кода, который должен быть потокобезопасным
> создается своя критическая секция
не совсем так. крит секция создается для каждого РЕСУРСА, который нужно защитить от многопотокового доступа. Например для переменной или группы переменных, которые нужно рассматривать как единый ресурс. Или блок памяти. А вот участки кода, которые осуществляют доступ к этому ресурсу уже нужно обрамлять в Enter/LeaveCriticalSection


Мастер   (2004-08-10 15:13:00) [2]

>iPod   (10.08.04 14:59) [13]
Критическая секция служит для выполнения потокобезопасного кода.
Что это означает?

1. Для каждогоучастка кода, который должен быть потокобезопасным создается своякритическая секция(так как одновременно этот код может выполняться только одним потоком).
2. Доступ к этому коду может осуществляться из любогопотока таким образом:
  EnterCriticalSection;
  <КОД>
  LeaveCriticalSection;


iPod   (2004-08-10 15:11:00) [3]

Ну я и идиот :). Спасибо, сейчас буду пробовать.


jack128   (2004-08-10 15:05:00) [4]


> У меня уже так давно - и прогармма работает нормально
тебе повезло.

> разве нужно ее создавать только в одном потоке??
именно. И из всех потоков использовать именно эту крит секцию.


simpson   (2004-08-10 15:04:00) [5]

http://rosigma.boom.ru/richter/head8.htm
или
http://softs.h10.ru/literature.shtml?topic=visual&book=1&page=head8.htm


iPod   (2004-08-10 14:59:00) [6]

Что ЛОЛ? У меня уже так давно - и прогармма работает нормально. Что, разве нужно ее создавать только в одном потоке??


jack128   (2004-08-10 14:55:00) [7]


> У меня например в каждом потоке создается  отдельная критическия
> секция и она используется только в пределах того потока
> где и была создана
ЛОЛ!!!! Ты не понимаешь зачем нужна критическая секция!!!


iPod   (2004-08-10 14:53:00) [8]

Как это неважно каким потоком эта секция была изначально создана? У меня например в каждом потоке создается  отдельная критическия секция и она используется только в пределах того потока где и была создана. Вот и в главном потоке планирую создать крит. секцию и использовать ее только нем. Я разве не прав?


Digitman   (2004-08-10 14:40:00) [9]


> iPod   (10.08.04 14:29) [7]


в случае с крит.секцией разницы между основным и дополн. потоками нет - ЛЮБОЙ без разбору поток, планирующий доступ к защищенной переменной, ОБЯЗАН пользоваться для этой цели соотв.крит.секцией, причем неважно каким потоком эта секция была изначально создана


iPod   (2004-08-10 14:39:00) [10]

Значит если я создам в классе гл формы переменную типа TRTLCriticalSection и в рамках этого класса буду вызывать методы EnterCriticalSection и LeaveCriticalSection, то это поможет разграничить доступ к глобальным переменным из ВСЕХ потоков?


jack128   (2004-08-10 14:32:00) [11]


> Я и  использую критические секции;).
в этом случае крит секцию нужно использовать и основном потоке тоже


iPod   (2004-08-10 14:29:00) [12]

Я и  использую критические секции ;). Но я думаю, что если использовать крит. секции в осн. потоке, то тож смысла не будет или я не прав?


Digitman   (2004-08-10 14:14:00) [13]


> iPod   (10.08.04 13:43) [4]



> так бы просто Synchronize из основного потока


а смысл каков ? абсолютно никакого.. метод Synchronize( Метод) ставит Методв очередь исполнения осн.потоком .. нонсенс здесь заключается в том, что метод Synchronize, будучи вызванный в осн.потоке, по твоей логике, будет "пытаться" поставить Методв очередь самому себе.. на самом же деле Методв этом случае будет выполнен немедленно (синхронно), как если бы он был вызван безо всяких Synchronize, т.е. как обычным образом вызванный метод

вообще говоря, нет особого резона синхронизировать мультипоточный доступ к глоб.переменной именно с пом. предлагаемого Борландом метода Synchronize - этот метод "заточен" несколько для иного применения и не слишком быстр сам по себе ... гораздо проще организовать крит.секцию и защитить ей обращения к переменной как со стороны госновного, так и со стороны каждого из доп.потоков, в которых предполагается обращение к защищаемой переменной


Reindeer Moss Eater   (2004-08-10 13:48:00) [14]

Не там и не то читал.


iPod   (2004-08-10 13:43:00) [15]

Я читал, что НЕЛЬЗЯ синхронизировать доступ к переменным из ГЛАВНОГО потока! По этому и спрашиваю, а так бы просто Synchronize из основного потока да и делов то.


jack128   (2004-08-10 13:32:00) [16]


> к глобальным переменным в основном потоке
глобальные переменные пренадлежат всему процессу, а не какому то отдельному потоку.
Если те нужна отдельная переменная для каждого потока, то см threadvar


> дочерних потоков
а что это такое ?


> обращаются к этим переменным синхронизированно
все обращения к переменной из всехпотоков должны быть синхронизированы.


Skyle   (2004-08-10 13:32:00) [17]


> дочерних потоков также обращаются к этим переменным синхронизированно?

Если синхронизованно, то будет.
А главный поток тоже "синхронизованно" обращается?


iPod   (2004-08-10 13:27:00) [18]

Неужели мастера не могут дать ответ на столь тривиальный вопрос?


Наверх

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