2011-08-30 46 views
2

我已經在C++中使用QT API,但我想如果答案可以有效地從沒有任何QT經驗的人那裏得到。在多線程程序中使用的API中的非重入函數

QT在它的XML處理類中有一個名爲setContent()的函數,它被指定爲不可重入。被調用時,setContent()將XML文件讀入內存,並將其作爲數據結構返回。

據我所知,一個非重入函數是一個不安全的調用多線程,即使該函數被調用來操作不同的文件/對象。

因此,基於此,我的理解是,我將無法使用此函數打開多個線程來打開XML文件,除非這些線程同時受到保護而不能同時訪問setContent()函數。

這是正確的嗎?如果是這樣,似乎是編寫API的一個非常糟糕的方式,因爲這看起來並不像一個直覺上會引發多線程問題的函數。另外,the API沒有提供互斥體。

所以爲了在我的多線程程序中使用這個函數,其中多個線程將打開不同的XML文件,處理對setContent()函數的訪問的最佳方法是什麼?我是否應該在每個將訪問XML的文件中包含的頭文件中創建一個extern互斥量?

回答

1

看起來像是所有關於static QDomImplementation::InvalidDataPolicy invalidDataPolicy。這是QDom ***類使用的唯一靜態數據。

setContent和一堆全局函數在解析時使用它的值,並且如果另一個線程在中間更改它,顯然可能會發生某些情況。

我想如果你的程序從不調用setInvalidDataPolicy(),你可以安全地解析來自不同線程的XML。

1

因此,基於這一點,我的理解是,我不能夠有某種方式打開使用此功能,除非 XML文件,這兩個線程都對訪問 setContent保護的 多個線程()功能在同一時間。

我想你是對的。

所以爲了我的多線程程序使用此功能,其中 多個線程將開設不同的XML文件,有什麼處理訪問setContent()函數 最好的方法? 是否應該在每個將訪問XML的文件包含在 中的頭文件中創建一個extern互斥量?

同樣,我傾向於同意你關於互斥鎖的看法。 (順便說一下,Qt提供了QMutex)但是我不確定頭文件中extern mutex是什麼意思,所以我只需確保實例化一個互斥量,然後向這個互斥量分派一個指針給所有需要它的線程。

相關問題