<div dir="ltr">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! (<a href="https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/doc/panama_memaccess.md#segments">https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/doc/panama_memaccess.md#segments</a>) 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<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com">maurizio.cimadamore@oracle.com</a>> 于2023年3月27日周一 17:07写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

  
  <div>
    <p>Hi,<br>
      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).</p>
    <p>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.<br>
    </p>
    <p>Hope this helps.</p>
    <p>Maurizio<br>
    </p>
    <div>On 27/03/2023 08:48, 刘希晨 wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">I
          have a question about using MemorySegment with
          Arena.openShared().</div>
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">I
          don't know if the memory created by Arena.openShared() or any
          other shared scope would be safely accessed by multiple
          threads.</div>
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">Simply
          put, if a writer thread wrote something into the MemorySegment
          and then passing it to the reader thread using a
          BlockingQueue,</div>
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">I
          am confused if the writer operation would already be visible
          to the reader thread.</div>
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">I
          have tested its visibility using jcstress and it turns out
          every Varhandle.get() will successfully read the data changed
          in another thread, </div>
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">even
          without volatile or locks, so I am confused if the jvm has
          already created memory fence for memorysegment's access.</div>
        <div style="color:rgb(0,0,0);font-family:Arial;font-size:14px;margin:0px">I
          hope the authorities could offer a suggested way of accessing
          same memory segment in multiple threads in Panama FFI's
          documentation.</div>
      </div>
    </blockquote>
  </div>

</blockquote></div>