2

私は C++ で QT API を使用していますが、QT の経験がない人からも効果的な答えが得られると思います。

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

私が理解しているように、再入不可の関数は、関数が異なるファイル/オブジェクトを操作するために呼び出されたとしても、複数のスレッドから同時に呼び出すのは安全ではありません。

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

これは正しいです?もしそうなら、これは直感的にマルチスレッドの問題を引き起こす関数のようには見えないので、API を書くには本当に貧弱な方法のように思えます。さらに、APIによって提供されるミューテックスはまったくありません。

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

4

2 に答える 2

1

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

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

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

繰り返しになりますが、ミューテックスに関してはあなたに同意する傾向があります。(ちなみに、Qt はQMutexを提供します) しかし、ヘッダー ファイル内の extern ミューテックスの意味がわからないので、正確に 1 つのミューテックスをインスタンス化し、このミューテックスへのポインターをすべてのサーバーにディスパッチします。それを必要とするスレッド。

于 2011-08-30T17:16:05.797 に答える
1

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

setContentそして、一連のグローバル関数が解析時にその値を使用し、別のスレッドが途中でそれを変更すると、明らかに何かが起こる可能性があります.

あなたのプログラムが を呼び出さないのであれば、setInvalidDataPolicy()別のスレッドから安全に XML を解析できると思います。

于 2011-08-30T17:15:30.240 に答える