Вам все еще нужна какая-то синхронизация между вашими двумя потоками. Даже если вы использовали бит, байт или слово, чтобы указать, что данные были грязными, нет гарантии, что остальная часть буфера была обновлена одновременно. Вам все еще нужен этот барьер памяти для обновления буферов между потоками.
Не существует такого понятия, как "атомный массив". Вы можете читать и писать отдельные байты или слова атомарно, но как только у вас есть два из них, операция не является атомарной. Ваш грязный флаг может быть обновлен атомарно, но если у вас есть дополнительные буферы информации, которые разделяются между потоками, вам нужно синхронизироваться, чтобы буферы были обновлены в памяти другого потока.
Кроме того, массив атомарных типов (volatile
или Atomic*
) будет намного , намного менее эффективен, поскольку каждый доступ к атомарному значению вызовет память барьер для огня. Значительно эффективнее синхронизировать один буфер с блокировками, как сейчас. Таким образом, одна (или несколько) страниц памяти могут обновляться одновременно, в отличие от большого количества небольших обновлений.
Кроме того, в модели «производитель / потребитель», которая, как я полагаю, у вас есть, потребителю потребуется что-то, что будет wait()
до тех пор, пока производитель не будет завершен, а производителю потребуется wait()
на что-то, чтобы получить отброшенный буфер из потребитель. Ожидание блокировок (или блокирование очередей - см. Ниже) - эффективный способ сделать это.
Здесь следует рассмотреть некоторые другие вещи вместо
- Используйте пару блокирующих очередей , чтобы потребитель ожидал в очереди, а затем добавил отброшенные буферы в очередь сброса. Производитель сделал бы обратное.
- Вы смотрели на ByteBuffer ?