On 10/27/2017 01:20 PM, [email protected] wrote:
QMap isn't thread safe, so I don't think your use is guaranteed to be
safe, even if you're only reading.

You're right, in the formal sense of the word, but if there are no
`mutable` members or `const_cast` usage a reentrant class can be used from
different threads IF the calls are read-only. I sometimes use `QHash` like
this where I need to read from a pre-populated hash from different threads,
with the understanding there's no need to lock something if the memory is
never changed.
One must be __very__ careful when tossing around the phrase "read only" when speaking of QMap.

http://doc.qt.io/qt-5/qmap.html#operator-5b-5d


     T&QMap::operator[](constKey&/key/)

Returns the value associated with the key/key/as a modifiable reference.

*If the map contains no item with key****/key/**, the function inserts a*default-constructed value <http://doc.qt.io/qt-5/containers.html#default-constructed-value>into the map with key/key/, and returns a reference to it. If the map contains multiple items with key/key/, this function returns a reference to the most recently inserted value.

Even if you only intend to read [] has modify capability.
http://doc.qt.io/qt-5/qmap.html#value


     constTQMap::value(constKey&/key/, constT&/defaultValue/= T()) const

Returns the value associated with the key/key/.

If the map contains no item with key/key/, the function returns/defaultValue/. If no/defaultValue/is specified, the function returns adefault-constructed value <http://doc.qt.io/qt-5/containers.html#default-constructed-value>. If there are multiple items for/key/in the map, the value of the most recently inserted one is returned.

Notice the doc makes no hint about value() having write access to the data. Could lull someone into thinking it is safe across threads.

Let us not forget Qt's copy-when-needed shared data. I jumped into this late and didn't see the code for the QMap. If the value is an integer you will be fine, but, it used to be even a QString delayed copy until it had to so even something like:

QString myLocalStr = myMap.value("blah");

could create this time bomb when myMap exists in a different thread and the copy source/dest addresses could move before "when-needed" occurred. Used to be a problem anyway. I've modified my designs so long ago I just never run into these issues anymore.




--
Roland Hughes, President
Logikal Solutions
(630)-205-1593

http://www.theminimumyouneedtoknow.com
http://www.infiniteexposure.net
http://www.johnsmith-book.com
http://www.logikalblog.com
http://www.interestingauthors.com/blog
http://lesedi.us/
http://onedollarcontentstore.com

_______________________________________________
Interest mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to