Пункты памяти гарантируют, что кеш данных будет согласован. Однако, это гарантирует, что TLB будет согласован?
Я вижу проблему, когда JVM (обновление java 7 1) иногда с ошибками памяти (SIGBUS, SIGSEG) сбой при передаче MappedByteBuffer между потоками.
например.
final AtomicReference<MappedByteBuffer> mbbQueue = new AtomicReference<>();
// in a background thread.
MappedByteBuffer map = raf.map(MapMode.READ_WRITE, offset, allocationSize);
Thread.yield();
while (!inQueue.compareAndSet(null, map));
// the main thread. (more than 10x faster than using map() in the same thread)
MappedByteBuffer mbb = inQueue.getAndSet(null);
Без Thread.yield() я иногда получаю сбои в силе(), put() и C memcpy(), все указывает, что я пытаюсь получить доступ к памяти нелегально. С Thread.yield() у меня не было проблемы, но это не похоже на надежное решение.
Кто-нибудь сталкивался с этой проблемой? Существуют ли какие-либо гарантии относительно TLB и барьеров памяти?
EDIT: ОС - Centos 5.7, я видел поведение на i7 и Dual Xeon.
Почему я это делаю? Поскольку среднее время написания сообщения составляет 35-100 нс в зависимости от длины, а использование простой записи() не так быстро. Если карта памяти и очистка в текущем потоке занимает 50-130 микросекунд, то для использования фонового потока требуется около 3-5 микросекунд для основного потока для замены буферов. Зачем мне вообще нужно обменивать буферы? Поскольку я пишу много ГБ данных, а ByteBuffer не может быть размером 2+ ГБ.