[Development] Question about QCoreApplicationData::*_libpaths
Marc Mutz
marc.mutz at kdab.com
Fri Jan 22 21:16:01 CET 2016
On Friday 22 January 2016 19:37:22 Matthew Woehlke wrote:
> On 2016-01-22 13:02, Bubke Marco wrote:
> > Actually what is happen if I am in the middle of changing a qvector, and
> > then copying the vector in an other thread?
>
> Are you concurrently modifying and copying *the same* vector, or a
> shallow copy that, under the hood, happens to be shared? The latter is
> no problem; as soon as you try to modify the vector, it will detach, and
> they'll cease being shared. The one that's just being copied is not
> modified.
>
> If you really have *the same* vector... Don't do that :-). Note that
> this implies that you are either operating on the same variable, or one
> thread is operating on a reference. That's not very common, and it's
> just not thread safe, ever¹, regardless of the data type.
>
> (¹ Well, besides atomic types, but we're talking about containers...)
Actually, now that you mention this, std::vector guarantees that concurrent
write access to non-overlapping regions of a single vector is ok:
std::vector<QString> strings = ...;
auto process = [&strings](int from, int to) {
for (int i = from; i < to; ++i)
strings[i] = strings[i].toLower();
}
auto t = std::thread(process, 0, strings.size() / 2);
process(string.size() / 2, string.size());
t1.join();
For QVector, you need to ensure the container is detached to start with. If it
is shared, two threads may try to detach at the same time, racing over who
gets to update the d pointer.
Granted, this is easily fixed by handing iterators to the lambda, but only
because that causes the QVector to detach before any thread is started.
I expect this to bite when people try to use #pragma omp parallel or similar.
I don't think omp parallel loops can use iterators as control variables. They
need indexes.
Thanks,
Marc
--
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt Experts
More information about the Development
mailing list