I would put all of the mutations on a queue so they are single threaded.

> On Jul 5, 2022, at 9:51 AM, robert engels <reng...@ix.netcom.com> wrote:
> 
> This is a recipe for bad bugs. Use defensive programming - grab the lock in 
> the top-level functions, have private functions like ‘doXXXXWithLock()’ as a 
> signal to the developer that they must be holding the lock.
> 
> Allowing callbacks to call back into a concurrent safe structure is very 
> difficult - because the callbacks can easily be made async as well. 
> 
> I would just re-entrant locks. And ensure that no locks are held when the 
> callback is made - or if it is - it needs to be heavily documented on what 
> the callee can do.
> 
> Still, in your case without detailing api design available I am guessing you 
> are going to run in deadlocks very quickly.
> 
> 
> 
>> On Jul 5, 2022, at 9:31 AM, Marvin Renich <m...@renich.org> wrote:
>> 
>> * atd...@gmail.com <atd...@gmail.com> [220705 10:03]:
>>> :) That's what the asterisked note was for in the original question. I 
>>> don't think I can do that in the real code because the real code is much 
>>> more complex. Each node actually triggers a callback that may modify 
>>> another node. That callback is user-created, not framework created so I 
>>> have no way of knowing if the lock has already been taken.
>>> 
>>> And I wouldn't want for library users to have to make that distinction 
>>> themselves.
>> 
>> Have the Set method always take some type of context, which is a pointer
>> type.  If the context is nil, assume a top-level call to Set, otherwise
>> use the context to decide what to do.  All the callbacks will be
>> required to accept a context and pass it to the Set method.
>> 
>> If you have multiple goroutines that can be making top-level Set calls,
>> I see no way around using something to distinguish top-level calls from
>> Set within callbacks.
>> 
>> ...Marvin
>> 
>>> On Tuesday, July 5, 2022 at 3:48:16 PM UTC+2 Brian Candler wrote:
>>> 
>>>> Have a public Set() that does the lock and then calls a private internal 
>>>> function, which assumes it's already running under the lock.
>>>> https://go.dev/play/p/M1XuC8bxCxL
>>>> 
>>>> On Tuesday, 5 July 2022 at 13:32:26 UTC+1 atd...@gmail.com wrote:
>>>> 
>>>>> Hi,
>>>>> 
>>>>> I have a tree datastructure where mutating some nodes *may *trigger a 
>>>>> mutation on some other tree nodes.
>>>>> 
>>>>> This tree should be accessible by multiple goroutines but mutated by only 
>>>>> one at a time.
>>>>> 
>>>>> As such, I wanted to have a global lock on the tree such that mutatiing 
>>>>> node methods should acquire this lock beforehand.
>>>>> 
>>>>> But it seems to require for the mutex to be reentrant? 
>>>>> 
>>>>> I have tried to create a very simplified*** model to illustrate 
>>>>> https://go.dev/play/p/v37cbYQ1jSY
>>>>> 
>>>>> (***) I know people might want to suggest for the Set method to use a 
>>>>> lockless variant when iterating over the linked nodes but in the real 
>>>>> code, 
>>>>> it iterates over user created callbacks instead and I don't think I can 
>>>>> expect callbacks writers to juggle between the two kind of methods to 
>>>>> avoid 
>>>>> deadlocks.
>>>>> 
>>>>> Any suggestion?
>>>>> 
>>>>> 
>> 
>> -- 
>> 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/YsRLSsBPXIbN0Nob%40basil.wdw.
> 

-- 
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/957CA77E-9BED-46F6-9C40-4CE17AB7E17B%40ix.netcom.com.

Reply via email to