Question about multi threads visiting shared arena
刘希晨
benrush0705 at gmail.com
Mon Mar 27 09:56:18 UTC 2023
Thank you very much for the clarification, I really appreciate it. Perhaps
you could add some instructions on the recommended way of handling multi
threads access over MemorySegment in the documentation, so people could
understand it better! (
https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/doc/panama_memaccess.md#segments)
The API in VarHandle are not only provided for MemorySegment and rather
low-level, a newbie like me would really got confused of which way to use
Maurizio Cimadamore <maurizio.cimadamore at oracle.com> 于2023年3月27日周一 17:07写道:
> Hi,
> accessing a shared memory segment is pretty much the same as accessing a
> byte buffer, or a Java array instance. There are no additional memory
> fences that are added by our implementation when using "plain" access (as
> in all the other APIs I have listed), so, in the general case you would
> probably need to use VarHandle::fullFence() or something similar (to make
> sure all writes are flushed when one thread is done with the segment).
>
> It is surprising to see that it worked even w/o adding
> synchronization/fencing, but that might just be "luck", or the particular
> system you are using, as is often the case with these matters. From a
> low-level/implementation perspective there is absolutely no happens-before
> relationship inserted between writes on a memory segment and reads on the
> same segment (when using VarHandle::get - that is - a "plain" read/write).
> That is, plain access really means plain access.
>
> Hope this helps.
>
> Maurizio
> On 27/03/2023 08:48, 刘希晨 wrote:
>
> I have a question about using MemorySegment with Arena.openShared().
> I don't know if the memory created by Arena.openShared() or any other
> shared scope would be safely accessed by multiple threads.
> Simply put, if a writer thread wrote something into the MemorySegment and
> then passing it to the reader thread using a BlockingQueue,
> I am confused if the writer operation would already be visible to the
> reader thread.
> I have tested its visibility using jcstress and it turns out every
> Varhandle.get() will successfully read the data changed in another thread,
> even without volatile or locks, so I am confused if the jvm has already
> created memory fence for memorysegment's access.
> I hope the authorities could offer a suggested way of accessing same
> memory segment in multiple threads in Panama FFI's documentation.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20230327/d9b27c0c/attachment-0001.htm>
More information about the panama-dev
mailing list