2012-09-14 100 views
0

Qt的文檔聲明所有QDateTime函數都是可重入的,用Qt表示,如果您在另一個線程中創建QDateTime的新對象,則可以安全地使用它。但以下靜態成員線程安全:QDateTime :: currentDateTime和QDateTime :: fromTime_t?Qt庫 - 靜態成員函數的線程安全

代碼在輔助線程:

// 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:數

回答

4

如果您需要一個線程安全的方式來獲取當前時間的QDateTime對象,請創建一個保護不安全調用的函數。

QDateTime getCurrentTime() 
{ 
    static QMutex mutex; 
    QMutexLocker locker(&mutex); 
    return QDateTime::currentDateTime(); 

} 
+0

謝謝。關於問題的第一部分,爲什麼QDateTime的所有函數都可重入時,http://doc.qt.nokia.com/4.7-snapshot/thread-basics.html上的文章將其描述爲非線程安全的?這是否意味着像QTimer :: singleShot,QString :: fromUtf8和QString:number這樣的其他靜態函數也應該使用互斥體進行保護? –

+0

重讀http://doc.qt.nokia.com/4.7-snapshot/threads-reentrancy.html,瞭解Qt對「可重入」的定義。我在兩行之間閱讀,但我的看法是,如果使用來自類的靜態數據,則不能使用每個線程的不同數據調用重入靜態函數。當然,你也可以爭辯說靜態函數沒有實例,所以可重入的靜態函數本質上是線程安全的。 –