mutable, const, immutable guidelines

Daniel Davidson nospam at spam.com
Thu Oct 10 04:12:29 PDT 2013


On Wednesday, 9 October 2013 at 23:05:27 UTC, qznc wrote:
> On Wednesday, 9 October 2013 at 15:50:55 UTC, Daniel Davidson 
> wrote:
>> void foo(const(MutableType) mt);
>> void foo(immutable(MutableType) mt);
>>
>> Naturally the inclination is to choose the second as it is a 
>> stronger guarantee that no threads are changing the data. 
>> Cool. But wait, the first one still probably requires the same 
>> guarantee, even if it does not state it. If in the const case 
>> another thread changes the state of mt during the function foo 
>> then it will fail. foo actually requires that mt not be change 
>> by other threads during its operation - that is the only sane 
>> way of using the data in the function.
>
> Why "the first one still probably requires the same guarantee"?
> Why would foo fail if "in the const case  another thread 
> changes the state of mt"?
> If foo is not thread-safe, then it should require immutable.
>
>> Take, for example, LinearCongruentialEngine from random.d. It 
>> has a function:
>>
>>    bool opEquals(ref const LinearCongruentialEngine rhs) const
>>
>> Why is it using const here instead of immutable? Does it not 
>> care about other threads? No - it just is not smart enough to 
>> deal with it. It assumes other threads won't be changing it or 
>> if they are caveat developer. So when do you use immutable as 
>> a signal that not only will this function not change it, no 
>> thread will change it either? Probably when you know you have 
>> to deal with threading. But that then would be coupling two 
>> maybe orthogonal decisions - the threading of a program and 
>> the signature of functions.
>
> Hm, that actually looks like a bug. If LinearCongruentialEngine 
> is instantiated with a UIntType larger than size_t, it is not 
> thread-safe, but this seems to be claimed in the section header.
>
> Why are those two decisions orthogonal? The signature of a 
> function is a contract between caller and callee. If an 
> argument is const, it means the callee says he can handle 
> others changing the state concurrently.

I don't think that is how people interpret and use const. The 
general guideline is, for function parameters use const because 
it is most accepting - it takes mutable, immutable and const. If 
there are multiple threads developer beware.

Threading is or can be somewhat orthogonal to function signatures 
simply because you can write a whole lot of code with the const 
guideline above. Then with proper serialized access use that 
thread unaware code in multi-threaded context.


More information about the Digitalmars-d-learn mailing list