2011-08-30 8 views
2

QT APIをC++で使用していますが、QTの事前の経験がなくても回答が効果的に来ると思います。マルチスレッドプログラムで使用されているAPIのリエントラントでない関数

QTには、リエントラントではないと指定されたsetContent()というXML処理クラスの関数があります。 setContent()を呼び出すと、XMLファイルがメモリに読み込まれ、データ構造として返されます。

私が理解しているように、非リエントラント関数は、関数が異なるファイル/オブジェクトで動作するように呼び出されたとしても、複数のスレッドから同時に呼び出すのが安全でない関数です。

これに基づいて、私はこの機能を使用してXMLファイルを開く複数のスレッドを持つことができないことを理解しています。これらのスレッドの両方が同時にsetContent() 。

これは間違いありませんか?もしそうなら、これは直感的にマルチスレッドの問題を引き起こす関数のようには見えないので、APIを書くのは本当に貧弱な方法のようです。また、mutexは全くありません。the APIです。

複数のスレッドが異なるXMLファイルを開くマルチスレッドプログラムでこの関数を使用するには、setContent()関数へのアクセスを処理する最良の方法は何ですか? XMLにアクセスするすべてのファイルに含まれるヘッダファイルにextern mutexを作成する必要がありますか?

答えて

1

それはすべて約static QDomImplementation::InvalidDataPolicy invalidDataPolicyのように見えます。これは、QDom ***クラスが使用する唯一の静的データです。

setContentグローバル関数の束は解析時にその値を使用し、別のスレッドが真ん中でそれを変更した場合、明らかに何かが起こる可能性があります。

あなたのプログラムがsetInvalidDataPolicy()を呼び出すことがない場合、別のスレッドからXMLを解析することは安全です。

1

は、だから、これに基づいて、私の理解では)(私は何とか のsetContentにアクセスから保護されているこれらのスレッドの両方を ない限り、この機能を使用してXMLファイルを開きます 複数のスレッドを持つことができないだろうということです同時に機能します。

あなたは正しいと思います。

ので 複数のスレッドが別のXMLファイルを開くことになるところ、私のマルチスレッドプログラムでは、この機能を使用するためには、のsetContent()関数へのアクセスを処理するための 最良の方法は何ですか?私は XMLにアクセスするすべてのファイル によって含まれている独自のヘッダーファイルにextern mutexを作成する必要がありますか?

また、私はミューテックスに関してあなたと同意する傾向があります。 (ところで、QtはQMutexを提供しています)しかし、ヘッダファイルのextern mutexが何を意味するのかよく分かりませんので、ちょうど1つのmutexをインスタンス化し、このmutexへのポインタをすべてそれを必要とするスレッド

関連する問題