Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.037 c
14-1099429948
Andy BitOff
2004-11-03 00:12
2004.11.21
Интересно ваше мнение.


1-1099660532
Anton123
2004-11-05 16:15
2004.11.21
Имя компьютера


3-1098257683
Andrey_
2004-10-20 11:34
2004.11.21
Удаление рисунка из БД


1-1099258670
Mr.Devil
2004-11-01 00:37
2004.11.21
Поток в потоке...


14-1099130507
DelphiN!
2004-10-30 14:01
2004.11.21
Глюки Делфи 6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский