При чтении исходного кода Qt я испытываю замешательство по поводу следующего кода :
// No threads: so we can just use static variables
static QThreadData *data = 0;
QThreadData *QThreadData::current(bool createIfNecessary)
{
if (!data && createIfNecessary) {
data = new QThreadData;
data->thread = new QAdoptedThread(data);
data->threadId.store(Qt::HANDLE(data->thread));
data->deref();
data->isAdopted = true;
if (!QCoreApplicationPrivate::theMainThread)
QCoreApplicationPrivate::theMainThread = data->thread.load();
}
return data;
}
и его использования в QObject :: moveToThread
QThreadData *currentData = QThreadData::current();
QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : nullptr;
if (d->threadData->thread == 0 && currentData == targetData) {
// one exception to the rule: we allow moving objects with no thread affinity to the current thread
currentData = d->threadData;
}
Я думаю, QThreadData::current()
должен возвращать разные значения при вызове из другого потока, но как этого можно добиться в факте использования статических / глобальных данных?