Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Потоки  [new]
NZeg
Guest
два потока работают с TStringList
Первый поток считал первую строку - увеличил кол-во считанных строк
И так они поочерёдно строки считывают.
Т.е. к одной и той же строке оба они не могут обратиться.
Нужно ли этот код добавлять в критическую секцию?
10 окт 18, 21:13    [21701015]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2843
NZeg,

да хоть и к одной строке. если только оба читают. и никто параллельно не пишет. а вот счетчик надо синхронизировать.
10 окт 18, 22:01    [21701042]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
NZeg
Guest
Да, счётчик синхронизировал.
а если код в потоке заключить в try except, при одновременном обращении двух потоков к одной строке меня выкинет в except или поток просто завершится или ничего не будет?
10 окт 18, 22:08    [21701048]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
Олег Третьяков
Member

Откуда: Волгоград
Сообщений: 159
NZeg
а если код в потоке заключить в try except, при одновременном обращении двух потоков к одной строке меня выкинет в except или поток просто завершится или ничего не будет?
Обращения к списку из любого потока - readonly?
Никуда не выкинет и ничего не будет.
Но! Если добавляет, корректирует значения, удаляет третий поток - список должен быть потокобезопасным для всех потоков.

NZeg
два потока работают с TStringList
Первый поток считал первую строку - увеличил кол-во считанных строк
Вот здесь я ничего не понял! Как работают? Откуда считал? Куда положил? Где увеличил?
NZeg
И так они поочерёдно строки считывают.
Т.е. к одной и той же строке оба они не могут обратиться.
Чем это гарантировано?
NZeg
Да, счётчик синхронизировал.
Какой счетчик? С чем синхронизировал?
11 окт 18, 00:17    [21701111]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 628
как обычно, автор придумывает кривой алгоритм и пытается его реализовать

на самом деле обычно нужно создать поток, выдать ему ОДНУ строку из и запустить его
таких потоков создать N штук
при окончании работы потока в событии OnTerminate проверить, все ли строки обработаны, если нет, запустить новый поток с очередной строкой

и не надо ничего выдумывать ни с критическими секциями, ни с другими видами cинхронизаций
11 окт 18, 06:12    [21701138]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24330
NZeg
два потока работают с TStringList
Первый поток считал первую строку - увеличил кол-во считанных строк

Проще брать чёт-нечёт без всяких счетчиков.
11 окт 18, 07:30    [21701148]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
MBo
Member

Откуда:
Сообщений: 50
NZeg,

А какова реальная задача?
11 окт 18, 08:22    [21701164]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
Dimonka
Member

Откуда:
Сообщений: 1075
Возможно автору нужен TMultiReadExclusiveWriteSynchronizer?

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.SysUtils.TMultiReadExclusiveWriteSynchronizer

Подойдёт как раз для такого запущенного случая доступа к одному ресурсу.
11 окт 18, 11:06    [21701300]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
Василий 2
Member

Откуда:
Сообщений: 205
А чего городить странные вещи, если только чтение (я так полагаю, задача - это разгребание очереди заданий), то InterlockedIncrement и всё
11 окт 18, 11:15    [21701314]     Ответить | Цитировать Сообщить модератору
 Re: Потоки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
krapotkin
в событии OnTerminate проверить, все ли строки обработаны, если нет, запустить новый поток с очередной строкой
И зачем люди пулы потоков придумали? Если можно запустить, прибить, запустить...
11 окт 18, 14:50    [21701660]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить