|
|
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
Пишу небольшой эмулятор виртуального компьютера. Часть его памяти отведена под видеобуфер. Собственно, код эмулятора выполняется в одном потоке, а в другом потоке содержимое этого видеобуфера периодически выводится на экран. Я правильно понимаю, что для того, чтобы на экран выводилось всегда актуальное состояние видеобуфера, нужно гарантировать, чтобы к моменту отрисовки никакие данные, записанные в область памяти видеобуфера первым потоком эмулятора, не остались закешированными? Т.е. надо барьер памяти вставить перед отрисовкой? Как это сделать в данном случае и можно ли сбрасывать кеш только для определенного участка памяти, или барьер памяти в принципе весь кеш процессора сбрасывает? Если просто какую-нибудь volatile переменную завести и записывать в нее что-нибудь перед каждой прорисовкой видеобуфера, то это поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 23:06 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
AYTereschenko, Чтобы видеть актуальное состояние нужно, что бы между двумя операциями было happens-before. Соответственно, через volatile нужно, что бы вы в пишущем потоке писали в него, а в читающем - читали из него. Но там надо быть очень осторожным, если вам нельзя видеть промежуточные значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 23:46 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
cdtyjv, ну ок, значит volatile не годится, потому что в эмулирующем потоке я не знаю, когда наступает момент вывода изображения на экран. чем еще можно создать happens-before в такой ситуации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 01:15 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
Обычно видеопамять состоит из 2х буферов. Front/Back. Пока ты рисуешь в back - front отображается пользователю. После того как back отрисован они меняются местами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 01:38 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
mayton, да, конечно, но в данном конкретном случае никаких front/back нет. есть одна непрерывная область памяти, часть которой рассматривается как видеобуфер и выводится на экран, как это было в большинстве старых архитектур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 01:42 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
AYTereschenko, Может быть вам подойдет ReadWriteLock (или StampedLock в будущей Java8). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 10:15 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
cdtyjvAYTereschenko, Может быть вам подойдет ReadWriteLock (или StampedLock в будущей Java8). А как именно здесь можно применить RWL? В основном эмулирующем потоке мне не известны моменты времени, когда второй поток выводит картинку на экран. Постоянно проверять какой-нибудь флажок тоже не вариант, т.к. это сильно замедлит скорость эмуляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:09 |
|
||
|
Нужен ли барьер памяти и как его реализовать?
|
|||
|---|---|---|---|
|
#18+
AYTereschenkomayton, да, конечно, но в данном конкретном случае никаких front/back нет. есть одна непрерывная область памяти, часть которой рассматривается как видеобуфер и выводится на экран, как это было в большинстве старых архитектур. В настолько старых архитектурах никаких барьеров небыло. Поэтому не совсем понятно с чем боремся? Все прямые изменения в видео-буфере всегда видны при отрисовке, если иного не предусмотрено железкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:44 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=193&tid=2127921]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 391ms |

| 0 / 0 |
