Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.21;
Скачать: CL | DM;

Вниз

Потокобезопасные типы хранения данных ?   Найти похожие ветки 

 
Cheburek   (2004-11-09 20:14) [0]

Хай. Не поможете ?
Требуется тип данных, потокобезопасный.
Отвечают ли таким требованиям Variant ? Динамические массивы ? Представители класса TStringList ?
Желательно что бы был быстрый поиск, быстрая вставка и удаление, возможность хранить инфу в удобном виде.
Меня устраивает и TStringList, но вроде бы он не потокобезопасен, а Synhronize использовать не охота.
Помогите советом...

Заранее всем спасибо.


 
Cheburek   (2004-11-09 20:46) [1]

Удалено модератором


 
Anatoly Podgoretsky ©   (2004-11-09 20:55) [2]

Не отвечает, а отвечают только типы не большие чем 4 байта, которые могут быть прочитаны/записаны одной процессорной командой. Все остальные требуют синхронизации (то бишь блокировки на операцию).


 
panov ©   (2004-11-09 23:09) [3]

>Anatoly Podgoretsky ©   (09.11.04 20:55) [2]

Даже 4-х байтные типы не являются потокобезопасными при использовании на многопроцессорных компьютерах, несмотря на то, что Borland(почему - мне непонятно до сих пор), использует тип Boolean без защиты кода критической секцией.


 
panov ©   (2004-11-09 23:10) [4]

>Anatoly Podgoretsky ©   (09.11.04 20:55) [2]
Буду рад, если убедите в обратном раз и навсегда.


 
Anatoly Podgoretsky ©   (2004-11-09 23:18) [5]

Ну не знаю, убежду или нет, если операция атомарная, то она потокобезопасна. Видимо ты имеешь в виду, последовательность, чтение, модификация, запись, я же рассматриваю их по отдельности. Вот пример

A := 5; (1, 2, 4, на всякий случай выровненые на границу кеша)
A := B уже не безопасно.
A := A + 5 это уже вообще один известный пушной зверек.


 
panov ©   (2004-11-09 23:36) [6]

>Anatoly Podgoretsky ©   (09.11.04 23:18) [5]

Что будет, если 2 потока, выполняющихся на разных процессорах, одновременно будут записывать данные таким образом:

Поток 1:
A := $80;

Поток 2:
A := $40;

Определено ли будет значение переменной после выполнения такой операции, либо существуют механизмы, препятствующие писать в одну ячейку памяти разным процессорам?


 
KilkennyCat ©   (2004-11-09 23:40) [7]


> panov ©   (09.11.04 23:36) [6]


а вероятность, что они будут одновременно, высока?


 
Anatoly Podgoretsky ©   (2004-11-09 23:47) [8]

panov ©   (09.11.04 23:36) [6]
Насчет потоков все нормально, а вот насчет процессоров не могу сказать, не знаю какие сейчас механизмы доступа к памяти, но не думаю, что это возможно одновременно даже для ДМА, это был бы полнейних крах системы, так что кто последний тот и прав и это относится и к одному процессору точно также.

KilkennyCat ©   (09.11.04 23:40) [7]
Высокая


 
Verg ©   (2004-11-10 00:06) [9]

Если адрес 4-х байтника не выровнен по границе 4-х байтов, то операция записи или чтения может перестать быть атомарной?
Грубо говоря, арбитру шины может понадобится более одного цикла шины для записи этой ячейки. Между этими циклами возможен захват шины в пользу другого процессора, т.о. поток выполняющийся на нем может прочитать некое "промежуточное" значение этой ячейки.
Вот и выплывают InterLockedExchange и т.п., которые для многопроцессорного ядра выполняются с префиксом блокировки шины.
Вообще невыровненные поля структур  - это я считаю недостатком проекта. Поле структуры должно иметь смещение от начала структуры кратное размеру этого поля.


 
KilkennyCat ©   (2004-11-10 00:29) [10]

Прошу прощения, ежели слишком ламерно выскажусь, но насколько я слышал, разработка программ под более чем один процессор, равно как и ОС, поддерживающие мультипроцессорность, несколько отличается от стандартной схемы. Может, в эти отличия входит и защитный механизм от коллизий? раз вероятность совпадения высока, то это должно просто бросаться в глаза, тем, кто всю эту кашу заварил...

А вообще давно мечтал на практике посмотреть. Пожалуй, куплю двухпроцессорную мать с получки...


 
KilkennyCat ©   (2004-11-10 00:30) [11]

Кроме того, аппаратная реализация может запретить подобное.


 
Defunct ©   (2004-11-10 07:11) [12]

KilkennyCat ©   (10.11.04 00:29) [10]

> но насколько я слышал, разработка программ под более чем один процессор, равно как и ОС, поддерживающие мультипроцессорность, несколько отличается от стандартной схемы.

Когда вы пишите многопоточную программу на Delphi (хотя бы 2 потока), такая программа уже является программой, способной выполняться в SMP (Symmetric MultiProcessing) системе на двух процессорах (SMP - система с общей памятью).

Отличие в программировании будет только для не симметрических систем с разделяемой памятью (MPP - Massively Parallel System, NUMA - Non Uniform Memory Access) и расределенных систем (кластерная организация).

> либо существуют механизмы, препятствующие писать в одну ячейку памяти разным процессорам?

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


 
Defunct ©   (2004-11-10 07:35) [13]

> А вообще давно мечтал на практике посмотреть. Пожалуй, куплю двухпроцессорную мать с получки...

PS: это хорошее вложение.

> Может, в эти отличия входит и защитный механизм от коллизий?

Все гораздо проще, как отметил
Verg ©   (10.11.04 00:06) [9]
Между этими циклами возможен захват шины в пользу другого процессора
применяется механизм захвата системной магистрали, т.е. в конкретный момент времени с памятью может работать только одно устройство (либо процессор, либо КПДП).

> раз вероятность совпадения высока, то это должно просто бросаться в глаза, тем, кто всю эту кашу заварил...

Вопрос разрешения конфликтов по доступу к общему ресурсу является если не самым важным, то уж одним из наиболее важных в огранизации параллельных систем. Над ним и работают целые институты. Вот к примеру SUN Microsystems уже добилась того, что в SMP системе может быть сотни процессоров, а всего лишь пару лет назад число процессоров ограничивалось десятками.


 
KSergey ©   (2004-11-10 07:43) [14]

> [13] Defunct ©   (10.11.04 07:35)

Вы так изящно выражаетесь, что нифига я не понял ;)
А можно для тупых конкретно сказать: для процессоров Intel, применяемых в IBM PC (хотя какое оно IBM?) и подобных при современной архитектуре построения шин, магистралей и прочих умных слов запись константы в 4-х байтную переменную есть потокобезопастная операция или нет? А чтение значения (из ячейки памяти в регистр процессора, например)?

Что вообще есть признак атомарности? Одна процессорная инструкция? Или как?


 
Defunct ©   (2004-11-10 08:09) [15]

> Что вообще есть признак атомарности?

Признак атомарности - команда выполняется за один цикл обращения к памяти.

> Одна процессорная инструкция?
Нет, инструкция может быть неатомарной.
примеры:
Rep MovsD        <-- будет как минимум ECx*2 обращений к памяти
MovQ [EAx], EAx  <-- будет 2 или 3 обращения к памяти
Mov  [001], EAx  <-- будет 2 обращения к памяти

А может быть и атомарной:
Mov  [000], Eax  <-- одно обращение к памяти
Mov  [EAx], AL   <-- одно обращение к памяти (всегда)

Вопрос: Когда инструкция перестает быть атомарной?
Ответы:
1. Когда в память записывается суммарное количество информации, превышающее разрядность одного машинного слова (для IA-32 разрядность машинного слова = 32 bit, для 8088 - 8 bit, 8086 - 16 bit.
2. Когда запись машинного слова происходит по адресу не выровнянному на границу машинного слова (т.е. в памяти захватывается два машииных слова)

картинка, иллюстрирующая 2:


адрес байта:  0123 4567
память:       XXXX XXXX
                ^
запись           XX XX (пишется слово по невыровненному адресу)
                 

> Или как?
собсно вот так ;>

> конкретно сказать: для процессоров Intel
Можно:
на базе Intel можно создать SMP систему до 4-х процессоров, более большое число процессоров использовать неактуально (прирост производительности сильно снизится из-за возрастания числа конфликтов).


> запись константы в 4-х байтную переменную есть потокобезопастная операция или нет?

Есть потокобезопастная операция если переменная лежит по адресу кратному четырем

> А чтение значения (из ячейки памяти в регистр процессора, например)?

Чтение потокобезопастно тоже если инструкция атомарна. Иначе можно прочитать часть поля данных, в это время другой поток изменит вторую часть поля данных, вы ее прочитаете и получите ерунду.


 
Defunct ©   (2004-11-10 08:12) [16]

Defunct ©   (10.11.04 08:09) [15]
очепятка:

MovQ [EAx], MM0  <-- будет 2 или 3 обращения к памяти


 
Verg ©   (2004-11-10 08:20) [17]


> Когда запись машинного слова происходит по адресу не выровнянному
> на границу машинного слова (т.е. в памяти захватывается
> два машииных слова)


Я думаю, что дело скорее даже в разрядности системной шины. Вроде у пентюхов она 64 бита, т.е. 8 байтов.
Выравнивание на 8-байтовую кратность - гарантия атомарности?
Да, вот и компилер постоянно "подбивает" Record Field Aligment установить = 8...


 
Defunct ©   (2004-11-10 08:33) [18]

> Выравнивание на 8-байтовую кратность - гарантия атомарности?

Я тоже начинаю склоняться, что в P4 выравнивание на 8-ми байтовую кратность есть гарантия атомарности (по работе с MMX)
команда MOVQ работает быстрее если соблюдается выравние на границу DQ.

Чего не могу сказать о P1 (там не замечал никакого ускорения при выравнивании на DQ (DD, DQ - одинаково))

> Да, вот и компилер постоянно "подбивает" Record Field Aligment установить = 8...

Да желательно, SSE вот вообще только при выравнивании на DQ работает (MOVDQA) нет выравнивания - exception, причем сразу.


 
Defunct ©   (2004-11-10 08:41) [19]

> Я думаю, что дело скорее даже в разрядности системной шины. Вроде у пентюхов она 64 бита, т.е. 8 байтов.

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


 
Verg ©   (2004-11-10 08:49) [20]


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


Под выравниванием я понимаю условие "не пересечения" ячейкой границы слова системной шины.

Т.е запись word-а по адресам, например, 0-6 может быть произведена за один цикл, а по адресу 7 - уже только в два.


 
KSergey ©   (2004-11-10 09:30) [21]

> [15] Defunct ©   (10.11.04 08:09)

Спасибо большое.
Распечатаю, заучу.

> > конкретно сказать: для процессоров Intel
> Можно:
> на базе Intel можно создать SMP систему до 4-х процессоров,
> более большое число процессоров использовать неактуально
> (прирост производительности сильно снизится из-за возрастания
> числа конфликтов).

Во тут маненько не понял: MS заявляет о поддержке в серверных редакциях Win число процессоров много больше 4-х. Я, правда, не интересовался подробностями, но предполагал, что такое железо (на основе Intel) имеет место быть и какой-то смысл его применения есть. Я заблуждался?


 
Defunct ©   (2004-11-10 10:29) [22]

> Под выравниванием я понимаю условие "не пересечения" ячейкой границы слова системной шины.
> Т.е запись word-а по адресам, например, 0-6 может быть произведена за один цикл, а по адресу 7 - уже только в два.


Видимо все так и есть, во всяком случае для P4.


> Во тут маненько не понял: MS заявляет о поддержке в серверных редакциях Win число процессоров много больше 4-х.

Да можно и больше, располагаете финансами берите 16! 32! ;>
По сведениям компании ИКС, SMP системы на базе процессоров Intel показывают высокий КПД если в системе используется от одного до 4-х процессоров. Больше процессоров поставить конечно можно, но при этом упадет КПД.
Проще говоря картина примерно такая:

Был один процессор работает как 100%
2 процессора - 190%
4 процессора - 370%
8 процессоров - 700% (уже производительность одного процессора пропала из-за конфликтов)

больше процессоров - меньше прирост производительности.
Оптимальнее всего использовать системы на базе Intel с одним или двумя процессорами.

> Я, правда, не интересовался подробностями, но предполагал, что
> такое железо (на основе Intel) имеет место быть и какой-то
> смысл его применения есть.
> Я заблуждался?
нельзя сказать что вы заблуждаетесь, просто вероятно вы слышали не о SMP машинах (с общей памятью) в которых Intel не особо хорош (SMP лучшие решения от SUN и HP), а о суперкомпьютерах в которых Intel кстати на 3-м месте (если мне не изменяет память). Есть кластерные суперкомпьтеры на базе Intel и MPP суперкомпьтеры (тоже на базе обычных P-Pro)


 
Defunct ©   (2004-11-10 10:37) [23]

> Есть кластерные суперкомпьютеры на базе Intel и MPP суперкомпьютеры (тоже на базе обычных P-Pro)

Забыл добавить, в них число процессоров измеряется сотнями и тысячами.


 
panov ©   (2004-11-10 10:48) [24]

Резюмирая все выше сказанное:

1. Механизм защиты от одновременного использования памяти (4-х байтовых кусков) разными процессорами есть на аппаратном уровне.
2. Для использования этого механизма программисту необходимо отслеживать в своем коде границы, по которым выравниваются эти переменные.

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

PS.
И означает ли все это, что класс TThread не является потокобезопасным из-за прямого использования, например, FTerminated. Ведь явного выравнивания не указано в модуле.


 
Verg ©   (2004-11-10 11:10) [25]


> И означает ли все это, что класс TThread не является потокобезопасным
> из-за прямого использования, например, FTerminated. Ведь
> явного выравнивания не указано в модуле.


Нет, не означает. Допустим даже, что FTerminated не выравнено, хотя, по-моему поля классов всегда выравниваются.
Там всего-то надо понять - надо уже выходит из цикла или еще не надо. По-сути FTerminated - ноль или не ноль.


 
VMcL ©   (2004-11-10 12:10) [26]

>>panov ©  (10.11.04 10:48) [24]

Дык, FTerminated, вроде ж Boolean, то есть SizeOf -> 1 байт. Значит, с ним д. б. всё ОК.


 
Defunct ©   (2004-11-10 13:04) [27]

> А решения всех ли производителей одинаково полезны в этом отношении?

Кто ж его знает. Вот например, контроллер памяти с буфферизацией записи это хорошо или плохо?
- хорошо там где он установлен (не надо думать о выравнивании, каждая транзакция к памяти - потокобезопастна).
- плохо для совместимости (программу написали с учетом такого контроллера, соотв. там где нет такого контроллера она работать не сможет)

> Существует ли стандарт и все ли производители обязаны его придерживаться?
IEEE
конечно, иначе бы каждая китайская конторка делала бы что-то свое.


 
KSergey ©   (2004-11-10 13:17) [28]

> [27] Defunct ©   (10.11.04 13:04)

Как-то не клеятся слова

> Кто ж его знает.

и

> конечно, иначе бы каждая китайская конторка делала бы что-то свое

Так как же оно на самом-то деле? ;)


 
icWasya ©   (2004-11-10 14:17) [29]

>Defunct  [15]
...
Mov  [EAx], AL   <-- одно обращение к памяти (всегда ?)
...
Сдаётся мне что при 32-х разрядной шине данных тут будут иметь место такие действия
1) считывание из памяти 32 бита
2) замена 8 бит содержимым регистра AL
3) запись в память 32 бит
Поправьте меня, если я не прав, и как тут быть с атомарностью операции??


 
Cheburek   (2004-11-10 15:12) [30]

Спасибо, господа, за ваши высказывания. Но хочу всё же уточнить:

1. Глобальные переменные разделяются всеми потоками одного процесса?
2. Если разделяются - то нужно ли их синхронизировать
на операции чтений?
3. Если синхронизации на чтение не надо, то может исполлзовать списки ? ТStringList?
4. Я планирую, что у меня глобальные переменные будут изменяться одним потоком, остальные потоки будут его только читать. Во время записи - элементы будут захватываться критической секцией. Остальные потоки будут синхронизироваться.  Так нормально ?


 
panov ©   (2004-11-10 15:54) [31]

Cheburek   (10.11.04 15:12) [30]

1. Да, все потоки могут читать глобальные переменные.
2. Только если изменяются эти глобальные переменные.
3. Использовать можно все, что угодно, так как защищается код, в котором происходит обращение к разделенным участкам памяти.
4. Нормально, но нужно учитывать логику. Т.е. один случай - это когда всем читающим потокам безразлична согласованность данных, и другой случай, если все читающие потоки должны получить одинаковые данные.


 
Anatoly Podgoretsky ©   (2004-11-10 20:21) [32]

Verg ©   (10.11.04 08:20) [17]
Я думаю, что дело скорее даже в разрядности системной шины.

Можно дополнить, P-IV (a-c) ширина кеша 16 байт, это же обеспечивается за один такт при двух канальной памяти, а вот с P-IV (е) уже не так, там кеш 32 байта, надо разрабатывать 4 канальную память или память с шириной 16 байт, думаю Интел что ни будь сделает в этом плане.


 
Defunct ©   (2004-11-10 21:04) [33]

icWasya ©   (10.11.04 14:17) [29]

Поправляю, скорее дополняю:
в приведенном примере, до завершения операции чтение-модификация-запись шина будет занята одним и тем же процессором.



Страницы: 1 вся ветка

Текущий архив: 2004.11.21;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.044 c
14-1099780854
Knight
2004-11-07 01:40
2004.11.21
Вот везде есть примеры как отправить поток данных по сети...


6-1094372978
Johnny Raw
2004-09-05 12:29
2004.11.21
время последнего изменения http://www.delphimaster.ru


1-1099572575
Sectey
2004-11-04 15:49
2004.11.21
Что такое rtl70.bpl и почему оно дает исключение?


9-1090400471
1stGame
2004-07-21 13:01
2004.11.21
VCL или нет?


1-1099260966
Кто---то
2004-11-01 01:16
2004.11.21
Как преобразовать картинку в шрифт ?