FTR, I still don't think the docs *are* ambiguous. The authoritative part is
If a goroutine holds a RWMutex for reading and another goroutine might call > Lock, no goroutine should expect to be able to acquire a read lock until > the initial read lock is released. The rest is just additional explanation. This sentence alone is already sufficient to define the behavior. On Mon, Sep 21, 2020 at 2:14 PM Axel Wagner <axel.wagner...@googlemail.com> wrote: > On Mon, Sep 21, 2020 at 2:06 PM Henrik Johansson <dahankz...@gmail.com> > wrote: > >> Ambiguous docs however aren't generally good in any way. This came up as >> a consequence of real code being changed by a new very skilled developer >> and there was quite a bit discussion that could have been avoided with >> clearer docs. >> > > I think it would be useful to be more explicit about the use-case then. As > I said, I can't really fathom a situation where you'd *want* to do that and > if you don't want it, I can't imagine how it would matter whether you can. > > >> >> We have sorted the issue I mostly wanted to confirm my suspicion wrt >> nested read locks. >> >> On Mon, 21 Sep 2020, 13:31 Axel Wagner, <axel.wagner...@googlemail.com> >> wrote: >> >>> To elaborate a bit: You are correct in that there is a slight syntactic >>> ambiguity whether "this prohibits" refers to the entire sentence ("if >>> another goroutine might call Lock, then a second RLock might not be >>> acquired"), or only to the second half. I would argue the rest of the >>> section makes it clear that the second version is intended - "a goroutine >>> can not expect a second RLock to be acquired. This prohibits…". >>> >>> But yes, it certainly can be argued that the ambiguity hides the >>> possibility of nested RLocks when no other goroutine calls Lock. But even >>> if then: Given that this would not be useful (an RLock without a concurrent >>> Lock is functionally a no-op, AIUI), but *can* lead to incorrect code if >>> applied improperly, that possibility doesn't seem worthwhile to advertise >>> further. >>> >>> So even if the docs are ambiguous, that hardly seems a problem. >>> >>> On Mon, Sep 21, 2020 at 12:58 PM Axel Wagner < >>> axel.wagner...@googlemail.com> wrote: >>> >>>> It only says that's excluded *if* you can have a concurrent Lock call. >>>> >>>> On Mon, Sep 21, 2020 at 12:48 PM Henrik Johansson <dahankz...@gmail.com> >>>> wrote: >>>> >>>>> Yes that's the canonical deadlock but doesn't the docs say >>>>> >>>>> "In particular, this prohibits recursive read locking" >>>>> >>>>> which it doesn't unless you mix reads and writes. >>>>> >>>>> I get that it's not advisable but it's not prohibited either or there >>>>> would be a panic or something. >>>>> >>>>> On Mon, 21 Sep 2020, 12:30 Axel Wagner, <axel.wagner...@googlemail.com> >>>>> wrote: >>>>> >>>>>> (Note, FWIW, that in particular no write locks need to be *held*. >>>>>> It's enough for Lock to be *called*, it doesn't have to have returned >>>>>> yet) >>>>>> >>>>>> On Mon, Sep 21, 2020 at 12:29 PM Axel Wagner < >>>>>> axel.wagner...@googlemail.com> wrote: >>>>>> >>>>>>> I feel like the docs are pretty precise in what they say and why. >>>>>>> >>>>>>> a blocked Lock call excludes new readers from acquiring the lock. >>>>>>> >>>>>>> >>>>>>> This means, the following could happen: >>>>>>> Goroutine 1 calls RLock, acquires a Read-Lock >>>>>>> Goroutine 2 calls Lock, blocking >>>>>>> Goroutine 1 calls RLock again, blocking (as no new read locks can be >>>>>>> acquired while GR 2 is blocked). >>>>>>> Thus, you get a deadlock. >>>>>>> >>>>>>> It also has a conditional on the section >>>>>>> >>>>>>> If a goroutine holds a RWMutex for reading and another goroutine >>>>>>>> might call Lock […] >>>>>>> >>>>>>> >>>>>>> So if you know that no other goroutine might call Lock concurrently, >>>>>>> then yes, you can call RLock twice. I can't really imagine a setting >>>>>>> where >>>>>>> you'd need an RWMutex and have that assurance and need recursive read >>>>>>> locks. But there might be one. >>>>>>> >>>>>>> On Mon, Sep 21, 2020 at 12:16 PM Henrik Johansson < >>>>>>> dahankz...@gmail.com> wrote: >>>>>>> >>>>>>>> >>>>>>>> https://golang.org/pkg/sync/#RWMutex >>>>>>>> >>>>>>>> Holds that this prohibits recursive read locks but why would it? >>>>>>>> I understand that deadlocks can happen in case write locks are held >>>>>>>> in between the read locks >>>>>>>> but why can't a goroutine issue several RLock calls? >>>>>>>> >>>>>>>> It does actually work in the playground. >>>>>>>> https://play.golang.org/p/nOehJaeikxA >>>>>>>> Is this simply a recommendation or should the docs be updated to >>>>>>>> clarify what this means? >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> 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/CAKOF696YKSGn3j%2BcyX7o0ukA7wnD2Kq19_QGefUoeMELUZGOWA%40mail.gmail.com >>>>>>>> <https://groups.google.com/d/msgid/golang-nuts/CAKOF696YKSGn3j%2BcyX7o0ukA7wnD2Kq19_QGefUoeMELUZGOWA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> -- 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/CAEkBMfFRk1%3DVMMmq-MJVAz1zio4rnSMOo9TYKtkn-VHF4hH-Pw%40mail.gmail.com.