Can Q_GLOBAL_STATIC replace KStaticDelete ?

Thiago Macieira thiago at
Thu Jan 18 19:34:18 GMT 2007

Matthias Kretz wrote:
>On Thursday 18 January 2007 12:13, Thiago Macieira wrote:
>> We cannot also rely on the C++ compiler having guards against
>> reentrancy in static objects.
>Meaning we may not rely on
>static QGlobalStatic<TYPE > this_##NAME;
>to be atomic?

QGlobalStatic doesn't do anything. It's just a struct with a destructor.

It's the object creation and assignment that has to be thread-safe. That's 
why we need QAtomic, because the language itself provides no guarantees.

>template <typename T> class KGlobalStatic2
>    T* pointer;
>    inline KGlobalStatic2() : pointer(new T) {}
>    inline ~KGlobalStatic2()
>    {
>        delete pointer;
>        pointer = 0;
>    }
>#define K_GLOBAL_STATIC_THREADSAFE(TYPE, NAME)                         
> \ static TYPE *NAME()                                                 \
> {                                                                   \
> static KGlobalStatic2<TYPE > this_##NAME;                       \
> return this_##NAME.pointer;                                     \ }

Like I said, C++ does not guarantee thread-safety or even reentrancy for 
static object creations. This macro you posted is actually the thread 
unsafe version. For that, it's actually very useful and simple enough to 
be deployed.

  Thiago Macieira  -  thiago (AT) - thiago (AT)
    PGP/GPG: 0x6EF45358; fingerprint:
    E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <>

More information about the kde-core-devel mailing list