[cpp-threads] modes

Alexander Terekhov alexander.terekhov at gmail.com
Sat May 7 17:39:33 BST 2005


Err.

On 5/7/05, Alexander Terekhov <alexander.terekhov at gmail.com> wrote:
> On 5/7/05, Doug Lea <dl at cs.oswego.edu> wrote:
> [...]
> > 2. There's very little motivation to define CAS-with-acquire only.
> [...]
> > Also, as always, I just don't think that explicit LL/SC is worth
> > exposing. LL/SC instructions tend to have so many restrictions and
> > quirks that the just about only thing it is good for is CAS/weakCAS
> > emulation
> 
> I disagree on both accounts.
> 
> http://sourceware.org/ml/pthreads-win32/2004/msg00120.html
> (msync::acq can be replaced with msync::acq, and hopefully smart

(msync::acq can be replaced with msync::ccacq, and hopefully smart

> compiler can hoist {lw}sync out of attempt_update loop).
> 
> CAS-based version looks similar, but is less effecient when CAS
> is emulated on top of LL/LR-SC.
> 
> void lock() {
>  int old = load_naked(&m_lock_status);
>  if (old || old = cas_ccacq(&m_lock_status, 0, 1)) {
>    do {
>      while (old < 0 || old = cas_naked(&m_lock_status, 1, -1)) {
>        m_retry_event.wait(); // acquire semantics
>        old = load_naked(&m_lock_status);
>      }
>    } while (old = cas_ccacq(&m_lock_status, 0, -1));
>  }
> }
> 
> void unlock() {
>  int old = load_naked(&m_lock_status);
>  if (old < 0 || cas_rel(&m_lock_status, 1, 0) < 0) {
>     store_rel(&m_lock_status, 0);
>     m_retry_event.set(); // release semantics
>  }
> }

regards,
alexander.




More information about the cpp-threads mailing list