mutable, const, immutable guidelines

qznc qznc at web.de
Wed Oct 9 16:05:25 PDT 2013


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.



More information about the Digitalmars-d-learn mailing list