Форум: "Основная";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
ВнизTStringList между потоками... Найти похожие ветки
← →
Makhanev Alexander (2007-07-12 13:13) [0]юзать глобальную переменную типа TStringList в неск-ких потоках (одного типа) - надо тока через синхронизацию?
а простые переменные можно без синхронизации?
← →
Однокамушкин (2007-07-12 13:17) [1]Доступ к любым переменным надо синхронизировать, исключение допускается только в том случае, если несколько нитей используют какую-то переменную только для чтения, и ни одна другая нить во время их работы не будет эту переменную изменять...
Другое дело, что для доступа к StringList-у нет нужды использовать такой радитальный метод синхронизации как Synchronize, достаточно критических секций...
← →
DrPass © (2007-07-12 13:17) [2]
> а простые переменные можно без синхронизации?
Зависит от того, что ты считаешь "простыми". Атомарные типы вроде integer, char и т.д. можно и без синхронизации. Более сложные типы, например, строки и массивы - только с синхронизацией
← →
Инс © (2007-07-12 13:17) [3]
> а простые переменные можно без синхронизации?
Нет. Представьте что будет, если два потока будут одновременно писать в эту переменную свои значения, а потом - читать. Что там будет?
См Interlocked-функции
← →
Инс © (2007-07-12 13:19) [4]
> Атомарные типы вроде integer, char и т.д. можно и без синхронизации.
Интересное утверждение...
← →
Makhanev Alexander (2007-07-12 13:53) [5]итого - если заюзать глобальную критич. секцию, то всё буит ок?
← →
Инс © (2007-07-12 14:04) [6]
> итого - если заюзать глобальную критич. секцию, то всё буит
> ок?
Это смотря какая задача.
← →
Makhanev Alexander (2007-07-12 14:43) [7]кстати, а если юзится synchronize, то в critical section нет смысла?
то есть в главном потоке всё по очереди выполнится?
(если N потоков одновременно сделают synchronize(myprocedure))
← →
Makhanev Alexander (2007-07-12 14:45) [8]>Это смотря какая задача.
n потоков сохраняют в массив строк инфу, доступную всем потокам.
поток вначале читает массив и если там нет того чего надо, то пишет в него... т.е. массив накапливает какие-то данные для потоков..
← →
Makhanev Alexander (2007-07-12 14:46) [9]у тут хотелось бы точно знать - надо юзать CS при чтении из tstringlist"а или нет..
← →
umbra © (2007-07-12 14:50) [10]
> надо юзать CS при чтении из tstringlist"а или нет
если использовать - хуже не будет, а лучше - скорее всего
← →
Инс © (2007-07-12 14:54) [11]Во-первых, Synchronize злоупотреблять не нужно. Его вызов заставляет поток остановиться и подождать, пока главный поток освободится и выполнит метод, переданный в качестве параметра. Synchronize нужно использовать только если необходимо обратиться в из потока к визуальным компонентам. Для вашей задачи действительно подойдет критическая секция. Каждое обращение к глобальному ресурсу (в вашем случае - TStringList) из любого потока (будь то главный или нет) заключайте в рамке enter/leave одной и той же критической секции. Как работает критическая секция надеюсь знаете.
← →
Инс © (2007-07-12 14:56) [12]Немного добавит надо.
> Synchronize нужно использовать только если необходимо обратиться
> в из потока к визуальным компонентам.
... или если данный код по тем или иным причинам должен быть выполнен именно главным потоком.
← →
Kolan © (2007-07-12 14:59) [13]Я бы централизовал синхронизацию. То есть потоки ничего не знаю о глобольной TStrings, а у них есть событие
OnSendStrings
.
Всем потокам назначается один обработчик событияOnSendStrings
. В этом обработчкике и используйтеTCriticalSection
для синхронизации.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c