[vlc-devel] [PATCH 1/6] os2: implement vlc_once()
Rémi Denis-Courmont
remi at remlab.net
Tue Mar 27 17:43:34 CEST 2018
Le tiistaina 27. maaliskuuta 2018, 18.36.32 EEST Kamil Rytarowski a écrit :
> On 26.03.2018 13:16, KO Myung-Hun wrote:
> > Rémi Denis-Courmont wrote:
> >> POSIX model is simpler here, but it wouldn't work with C11 either.
> >
> > How about this ?
>
> There is no need for a mutex.
How do you handle the case that another thread is doing the initialization
without a mutex?
> An algorithm like follows should work better:
>
> static atomic_uint32_t bg_thread = {};
> if (atomic_load(&bg_thread, memory_order_relaxed) == 0 &&
> atomic_exchange(&bg_thread, 1, memory_order_relaxed) == 0) {
> cb();
> }
That can be equivalent reduced to:
static atomic_uint32_t bg_thread = {};
if (atomic_compare_exchange_strong_explicit(&bg_thread, &{0}, 1,
memory_order_relaxed, memory_order_relaxed) == 0)
cb();
This obviously lacks memory synchronization in the simple non-racy case, and
utterly fails in the racy corner case. In other words, it does not work at
all.
--
雷米‧德尼-库尔蒙
https://www.remlab.net/
More information about the vlc-devel
mailing list