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

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

Потокобезопасные типы хранения данных ? [D5, D7, Win95/98, WinXP]


Страницы:   1 2

Cheburek ©   (2004-11-09 20:14:00) 

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

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


Defunct   (2004-11-10 21:04:00) [1]

icWasya ©   (10.11.04 14:17) [29]

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


Anatoly Podgoretsky   (2004-11-10 20:21:00) [2]

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

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


panov   (2004-11-10 15:54:00) [3]

Cheburek   (10.11.04 15:12) [30]

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


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

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

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


icWasya   (2004-11-10 14:17:00) [5]

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


KSergey   (2004-11-10 13:17:00) [6]

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

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

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

и

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

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


Defunct   (2004-11-10 13:04:00) [7]

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

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

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


VMcL   (2004-11-10 12:10:00) [8]

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

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


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


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


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


panov   (2004-11-10 10:48:00) [10]

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

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

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

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


Defunct   (2004-11-10 10:37:00) [11]

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

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


Defunct   (2004-11-10 10:29:00) [12]

> Под выравниванием я понимаю условие "не пересечения" ячейкой границы слова системной шины.
> Т.е запись 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)


KSergey   (2004-11-10 09:30:00) [13]

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

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

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

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


Verg   (2004-11-10 08:49:00) [14]


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


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

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


Defunct   (2004-11-10 08:41:00) [15]

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

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


Defunct   (2004-11-10 08:33:00) [16]

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

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

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

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

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


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


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


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


Defunct   (2004-11-10 08:12:00) [18]

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

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


Defunct   (2004-11-10 08:09:00) [19]

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

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

> Одна процессорная инструкция?
Нет, инструкция может быть неатомарной.
примеры:
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-х байтнуюпеременную есть потокобезопастная операция или нет?

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

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

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


KSergey   (2004-11-10 07:43:00) [20]

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

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

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


Страницы:   1 2

Наверх

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