On 12/11/13 20:13, Samuel Thibault wrote:
> Hello,
> 
> OK, I believe that'll work indeed. What really makes it work is this:
> 
> Justus Winter, le Mon 11 Nov 2013 21:12:34 +0100, a écrit :
>> +      /* Decrement nreqthreads.  */
>> +      unsigned int tc = __atomic_sub_fetch (&thread_counts, 1,
>> +                                        __ATOMIC_RELAXED);
>> +      if (NREQTHREADS (tc) == 0)
> 
> You have atomicity between the decrementation and testing whether the
> resulting value is 0. That's why we were keeping the spinlock along the
> test. The same happens with the test on totalthreads below.
> 
> Now, there is no need for the two counters to be updated coherently,
> they are used for different reasons, and don't actually interfere. Also,
> mixing them into one int reduces the maximum number of threads to 65535,
> which is not so big.

Couldn't 8 byte integers be used here? That would give us the same number of
maximum threads.

Cheers,
Emilio

> So I'd say please move to using two unsigned ints. Yes, it means
> two atomic operations on thread creation/destruction, but that's an
> expensive operation already anyway (and we're not supposed to do that so
> often). Readability of the code is more important than that :)
> 
> Samuel
> 
> 


Reply via email to