Misuse of K_GLOBAL_STATIC?
Thiago Macieira
thiago at kde.org
Wed May 14 13:11:38 BST 2008
On Wednesday 14 May 2008 13:40:03 Jaroslaw Staniek wrote:
> Thiago Macieira said the following, On 2008-05-14 13:28:
> > On Wednesday 14 May 2008 13:21:47 Jarosław Staniek wrote:
> >> Hi, shouldn't we move K_GLOBAL_STATIC out of the bodies in such cases?
> >>
> >>
> >> KIMProxy * KIMProxy::instance()
> >> {
> >> K_GLOBAL_STATIC(KIMProxy, s_instance)
> >> return s_instance;
> >> }
> >
> > Yes, they should be out of function bodies. The use above is not what
> > K_GLOBAL_STATIC was intended to be. I recommend not doing it even though
> > it works. Something might change in the future.
>
> If so, please read my other post in this thread: we have many private
> ctors...
I want to publish a thread-safe QSingleton class with Qt 4.5 that would
alleviate that issue.
The above code could also be re-written as:
KIMProxy *KIMProxy::instance()
{
static KIMProxy *self;
Q_ONCE
self = new KIMProxy;
return self;
}
Unlike the global statics, that ensures the "new" call happens exactly once
(unless an exception is thrown). With the global statics, in the event of a
reentrancy, the static could be built more than once, even though only one
copy will survive.
That is supposed to match the code:
KIMProxy *KIMProxy::instance()
{
static KIMProxy *self = new KIMProxy;
return self;
}
that works perfectly fine in gcc, but whose behaviour is left undefined by the
C++ standard. (thread-safe statics)
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
PGP/GPG: 0x6EF45358; fingerprint:
E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20080514/5ca17c75/attachment.sig>
More information about the kde-core-devel
mailing list