[Interest] QAtomicInt overflow / wrap-around?
Thiago Macieira
thiago.macieira at intel.com
Thu May 15 01:14:24 CEST 2014
Em qui 15 maio 2014, às 00:38:46, Markus Pointner escreveu:
> Hi,
>
> I'd like to use a QAtomicInt to generate IDs, by calling
> fetchAndAddOrdered(1) to get a new ID. Sooner or later the QAtomicInt will
> reach INT_MAX (or whatever the constant is). Is it ok to continue with
> fetchAndAddOrdered(1), or do I have to manually reset the value to a sane
> minimum?
On all currently-supported platforms, it will wrap around to INT_MIN and start
generating negative numbers from there until -1, and then go to zero.
Since fetchAndAddOrdered is opaque to the compiler on most current
implementations, the undefined behaviour of signed integers overflow does not
really apply.
We've used that technique for Qt internal counters for some time. Examples:
http://code.woboq.org/qt5/qtbase/src/corelib/plugin/quuid.cpp.html#966
http://code.woboq.org/qt5/qtbase/src/gui/image/qicon.cpp.html#_ZN12QIconPrivateC1Ev
http://code.woboq.org/qt5/qtbase/src/gui/image/qimage.cpp.html#_ZN10QImageDataC1Ev
http://code.woboq.org/qt5/qtbase/src/gui/opengl/qopengltextureglyphcache.cpp.html#60
http://code.woboq.org/qt5/qtbase/src/network/kernel/qhostinfo.cpp.html#164
We used to use that for timer IDs too, until someone ran into problems with
the overflow to negative numbers. See
http://blog.qt.digia.com/blog/2008/10/22/a-never-ending-struggle/. After that,
we switched the timer IDs to a lock-free free list.
> I am aware that for regular non-atomic ints, this would be undefined
> behaviour, whereas unsigned ints are defined to wrap around. I would prefer
> the wrap-around behaviour for my atomic value.
Then use QAtomicInteger<unsigned>. That is guaranteed to exist and work on all
platforms. If you need a larger address space, use QAtomicInteger<quintptr> or
check if Q_ATOMIC_INT64_IS_SUPPORTED is defined.
http://doc-snapshot.qt-project.org/qt5-stable/qatomicinteger.html#details
Also, with Qt 5.3, you can simply do:
int id = ++atomic;
as we brought back the convenience API from Qt 4 and expanded it.
http://doc-snapshot.qt-project.org/qt5-stable/qatomicinteger.html#operator-2b-2b
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
More information about the Interest
mailing list