[Development] Thread-safety on implicitly-shared classes
Marc Mutz
marc.mutz at kdab.com
Mon Feb 6 11:26:39 CET 2012
Hi Thiago,
On Sunday February 5 2012, Thiago Macieira wrote:
> However, in practice, many people have begun relying on an implementation
> detail that read-only operations (the const methods) in those classes are
> thread-safe. That is, a shared object can be accessed without mutex
> protection provided only const functions are called.
>
> That is not codified in the documentation.
>
> I'd like to propose that it is and we say that all const methods in the
> implicitly-shared classes are thread-safe. It should also explain that
> calling a non-thread-safe method in the same object simultaneously with a
> thread-safe one breaks the safety (which is different to what
> "thread-safety" means to QCoreApplication::postEvent).
The correct way for formulate, I think, would be that objects originally
declared const are thread-safe. That is,
const QString s = ...;
makes accessing s thread-safe (read QString as a placeholder for any
implicitly shared class). In addition, const_casting &s to non-const QString
now results in undefined behaviour.
There are two caveats, though: construction needs to have finished. And the
question of when the result of the construction is actually seen by other
threads might pose a problem, too.
iow: In the C++11 memory model, unless the s.d pointer is atomic, I believe
this is still racy.
However, once you've established that construction of 's' has
C++11-happened-before any other use of 's' (via means external to QString,
e.g. by using Q_GLOBAL_STATIC[1]), I agree with you that the implementation
should guarantee thread-safety.
Thanks,
Marc
[1] new QString(args) is sequenced-before assignment to atomic pointer to
argument, which inter-thread-happens-before any use (hopefully, by design of
Q_GLOBAL_STATIC), which is sequenced before return of the function created in
Q_GLOBAL_STATIC, which is sequenced before any use of the result value of the
function.
--
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
www.kdab.com || Germany +49-30-521325470 || Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-Independent Software Solutions
More information about the Development
mailing list