2

我在 C++ 中使用 QT API,但我想答案可以有效地来自没有任何 QT 经验的人。

QT 在其 XML 处理类中有一个名为 setContent() 的函数,它被指定为不可重入的。调用时,setContent() 将 XML 文件读入内存,并将其作为数据结构返回。

据我了解,不可重入函数是从多个线程同时调用的不安全的函数,即使调用该函数以对不同的文件/对象进行操作也是如此。

因此,基于此,我的理解是,除非以某种方式保护这两个线程不能同时访问 setContent() 函数,否则我将无法拥有多个使用此函数打开 XML 文件的线程。

它是否正确?如果是这样,编写 API 似乎是一种非常糟糕的方式,因为这看起来根本不像是一个直观地会引发多线程问题的函数。此外,API根本不提供互斥锁。

因此,为了在我的多线程程序中使用此函数,其中多个线程将打开不同的 XML 文件,处理对 setContent() 函数的访问的最佳方法是什么?我应该在每个将访问 XML 的文件中包含的头文件中自己创建一个外部互斥锁吗?

4

2 回答 2

1

看起来一切都是关于static QDomImplementation::InvalidDataPolicy invalidDataPolicy。它是 QDom*** 类使用的唯一静态数据。

setContent并且一堆全局函数在解析的时候使用了它的值,如果中间另一个线程改变了它,显然可能会发生一些事情。

我想如果您的程序从不调用setInvalidDataPolicy(),那么您可以安全地从不同的线程解析 XML。

于 2011-08-30T17:15:30.240 回答
1

因此,基于此,我的理解是,除非以某种方式保护这两个线程不能同时访问 setContent() 函数,否则我将无法拥有多个使用此函数打开 XML 文件的线程。

我认为你是对的。

因此,为了在我的多线程程序中使用此函数,其中多个线程将打开不同的 XML 文件,处理对 setContent() 函数的访问的最佳方法是什么?我应该在每个将访问 XML 的文件中包含的头文件中自己创建一个外部互斥锁吗?

同样,我倾向于同意你关于互斥锁的看法。(顺便说一句,Qt 提供了QMutex)但是我不确定头文件中的 extern 互斥锁是什么意思,所以我只确保实例化一个互斥锁,并将指向该互斥锁的指针发送给所有需要它的线程。

于 2011-08-30T17:16:05.797 回答