在多线程程序中使用的API中的非重入函数

时间:2011-08-30 16:35:25

标签: multithreading qt reentrancy

我在C ++中使用QT API,但我认为答案可以从没有任何QT经验的人那里得到有效的答案。

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

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

基于此,我的理解是我不能有多个使用此函数打开XML文件的线程,除非这两个线程同时受到保护以防止访问setContent()函数。

这是对的吗?如果是这样,编写API似乎是一种非常糟糕的方式,因为这看起来根本不像是一个直觉会引发多线程问题的函数。此外,the API完全没有提供互斥锁。

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

2 个答案:

答案 0 :(得分:1)

看起来就像static QDomImplementation::InvalidDataPolicy invalidDataPolicy一样。这是QDom ***类使用的唯一静态数据。

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

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

答案 1 :(得分:1)

  

基于此,我的理解是我无法拥有   除非使用此函数打开XML文件的多个线程   不知何故,这两个线程都受到保护,不会访问   setContent()函数同时使用。

我认为你是对的。

  

所以为了在我的多线程程序中使用这个功能,在哪里   不止一个线程将打开不同的XML文件,是什么   处理对setContent()函数的访问的最佳方法是什么?我是不是该   在头文件中自己创建一个外部互斥锁,包括在内   每个将访问XML的文件?

同样,我倾向于同意你关于互斥锁。 (顺便说一下,Qt提供了QMutex)但是我不确定你在头文件中使用外部互斥锁是什么意思,所以我只需确保实例化一个互斥锁,然后发送一个指向这个互斥锁是需要它的所有线程。