В документации Qt говорится, что все функции QDateTime являются реентерабельными, что в терминах Qt означает, что если вы создаете новый объект QDateTime в другом потоке, вы можете безопасно работать с ним. Но являются ли следующие статические члены потокобезопасными: QDateTime :: currentDateTime и QDateTime :: fromTime_t?
Код во вторичном потоке:
// Is line below thread safe?
QDateTime tDateTimeNow1 = QDateTime::currentDateTime();
// The below code should be no different then the one above..
QDateTime tDateTimeNow2;
tDateTimeNow2 = tDateTimeNow2.currentDateTime();
Я смущен следующим утверждением в этой статье http://doc.qt.nokia.com/4.7-snapshot/thread-basics.html :
«QDateTime :: currentDateTime () не помечен как поточно-ориентированный в документации Qt, однако мы можем избежать использования его в этом небольшом примере, потому что мы знаем, что статический метод QDateTime :: currentDateTime () не используется ни в одном другие темы. »
Если QDateTime :: currentDateTime () нельзя использовать во вторичных потоках, то как мы можем создать объект QDateTime с текущей датой-временем потокобезопасным способом?
Вот другие статические функции-члены, подобные приведенным выше, которые я не знаю, могут ли они безопасно использоваться в потоках:
1) QTimer :: singleShot
2) QString :: fromUtf8
3) QString: число
Если вам нужен потокобезопасный способ получить объект QDateTime с текущим временем, создайте функцию, которая защищает небезопасный вызов.
QDateTime getCurrentTime()
{
static QMutex mutex;
QMutexLocker locker(&mutex);
return QDateTime::currentDateTime();
}
Других решений пока нет …