Your object can be initialized only once, and you cannot use it until it is initialized, so you do not need a mutex. However, you will need a mutex or other suitable lock in your DoIt function, since, as you said, it will be available for multiple threads.
Update for editable question: No, you do not need to worry about the processor cache. You must first create your object before you can get a handle to it. Only once, when you have this descriptor, you can transfer it to other flows which will be used. I am trying to say that the generated threads should begin after the creation of the original object, this is not possible for this to happen the other way around!
Mark ingram
source share