You can implement your own multiple-reader-single-writer-lock using what Go 
gives you.
For example: 
https://eli.thegreenplace.net/2019/implementing-reader-writer-locks/

> On Jan 30, 2023, at 4:42 PM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> Yes but only for a single reader - any concurrent reader is going to 
> park/deschedule. 
> 
> There’s a reason RW locks exist - and I think it is pretty common - but agree 
> to disagree :)
> 
>> On Jan 30, 2023, at 6:23 PM, Ian Lance Taylor <i...@golang.org> wrote:
>> 
>> On Mon, Jan 30, 2023 at 1:00 PM Robert Engels <reng...@ix.netcom.com> wrote:
>>> 
>>> Pure readers do not need any mutex on the fast path. It is an atomic CAS - 
>>> which is faster than a mutex as it allows concurrent readers. On the slow 
>>> path - fairness with a waiting or active writer - it degenerates in 
>>> performance to a simple mutex.
>>> 
>>> The issue with a mutex is that you need to acquire it whether reading or 
>>> writing - this is slow…. (at least compared to an atomic cas)
>> 
>> The fast path of a mutex is also an atomic CAS.
>> 
>> Ian
>> 
>>>>> On Jan 30, 2023, at 2:24 PM, Ian Lance Taylor <i...@golang.org> wrote:
>>>> 
>>>> On Mon, Jan 30, 2023 at 11:26 AM Robert Engels <reng...@ix.netcom.com> 
>>>> wrote:
>>>>> 
>>>>> I don’t think that is true. A RW lock is always better when the reader 
>>>>> activity is far greater than the writer - simply because in a good 
>>>>> implementation the read lock can be acquired without blocking/scheduling 
>>>>> activity.
>>>> 
>>>> The best read lock implementation is not going to be better than the
>>>> best plain mutex implementation.  And with current technology any
>>>> implementation is going to require atomic memory operations which
>>>> require coordinating cache lines between CPUs.  If your reader
>>>> activity is so large that you get significant contention on a plain
>>>> mutex (recalling that we are assuming the case where the operations
>>>> under the read lock are quick) then you are also going to get
>>>> significant contention on a read lock.  The effect is that the read
>>>> lock isn't going to be faster anyhow in practice, and your program
>>>> should probably be using a different approach.
>>>> 
>>>> Ian
>>>> 
>>>>>>> On Jan 30, 2023, at 12:49 PM, Ian Lance Taylor <i...@golang.org> wrote:
>>>>>> 
>>>>>> On Sun, Jan 29, 2023 at 6:34 PM Diego Augusto Molina
>>>>>> <diegoaugustomol...@gmail.com> wrote:
>>>>>>> 
>>>>>>> From times to times I write a scraper or some other tool that would 
>>>>>>> authenticate to a service and then use the auth result to do stuff 
>>>>>>> concurrently. But when auth expires, I need to synchronize all my 
>>>>>>> goroutines and have a single one do the re-auth process, check the 
>>>>>>> status, etc. and then arrange for all goroutines to go back to work 
>>>>>>> using the new auth result.
>>>>>>> 
>>>>>>> To generalize the problem: multiple goroutines read a cached value that 
>>>>>>> expires at some point. When it does, they all should block and some I/O 
>>>>>>> operation has to be performed by a single goroutine to renew the cached 
>>>>>>> value, then unblock all other goroutines and have them use the new 
>>>>>>> value.
>>>>>>> 
>>>>>>> I solved this in the past in a number of ways: having a single 
>>>>>>> goroutine that handles the cache by asking it for the value through a 
>>>>>>> channel, using sync.Cond (which btw every time I decide to use I need 
>>>>>>> to carefully re-read its docs and do lots of tests because I never get 
>>>>>>> it right at first). But what I came to do lately is to implement an 
>>>>>>> upgradable lock and have every goroutine do:
>>>>>> 
>>>>>> 
>>>>>> We have historically rejected this kind of adjustable lock.  There is
>>>>>> some previous discussion at https://go.dev/issue/4026,
>>>>>> https://go.dev/issue/23513, https://go.dev/issue/38891,
>>>>>> https://go.dev/issue/44049.
>>>>>> 
>>>>>> For a cache where checking that the cached value is valid (not stale)
>>>>>> and fetching the cached value is quick, then in general you will be
>>>>>> better off using a plain Mutex rather than RWMutex.  RWMutex is more
>>>>>> complicated and therefore slower.  It's only useful to use an RWMutex
>>>>>> when the read case is both contested and relatively slow.  If the read
>>>>>> case is fast then the simpler Mutex will tend to be faster.  And then
>>>>>> you don't have to worry about upgrading the lock.
>>>>>> 
>>>>>> Ian
>>>>>> 
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "golang-nuts" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>>> an email to golang-nuts+unsubscr...@googlegroups.com.
>>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcXNVFkc5H-L6K4Mt81gB6u91Ja07hob%3DS8Qwgy2buiQjQ%40mail.gmail.com.
>>>> 
>>>> --
>>>> You received this message because you are subscribed to the Google Groups 
>>>> "golang-nuts" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>>> email to golang-nuts+unsubscr...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcWJ%2BLPOoTk9H7bxAj8_dLsuhgOpy_bZZrGW%3D%2Bz6N%3DrX-w%40mail.gmail.com.
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts+unsubscr...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcVLzkTgiYqw%2BWh6pTFX74X-LYoyPFK5bkX7T8J8j3mb%3Dg%40mail.gmail.com.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/E700E6A8-0114-4F64-9042-B9E9C62F06FA%40ix.netcom.com.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/945C31EB-533E-4B1C-AABF-106A790FCB24%40iitbombay.org.

Reply via email to