我在C ++中使用QT API,但我认为答案可以从没有任何QT经验的人那里得到有效的答案。
QT在其XML处理类中有一个名为setContent()的函数,该函数被指定为不可重入。调用时,setContent()将XML文件读入内存,并将其作为数据结构返回。
根据我的理解,不可重入的函数是从多个线程同时调用的安全函数,即使调用该函数对不同的文件/对象进行操作也是如此。
基于此,我的理解是我不能有多个使用此函数打开XML文件的线程,除非这两个线程同时受到保护以防止访问setContent()函数。
这是对的吗?如果是这样,编写API似乎是一种非常糟糕的方式,因为这看起来根本不像是一个直觉会引发多线程问题的函数。此外,the API完全没有提供互斥锁。
因此,为了在我的多线程程序中使用此函数,多个线程将打开不同的XML文件,处理setContent()函数访问的最佳方法是什么?我应该自己在头文件中创建一个extern互斥锁,它将被每个将访问XML的文件包含在内吗?
答案 0 :(得分:1)
看起来就像static QDomImplementation::InvalidDataPolicy invalidDataPolicy
一样。这是QDom ***类使用的唯一静态数据。
setContent
并且一堆全局函数在解析时使用它的值,如果另一个线程在中间更改它,显然可能会发生某些事情。
我想如果你的程序从不调用setInvalidDataPolicy()
,你可以安全地从不同的线程解析XML。
答案 1 :(得分:1)
基于此,我的理解是我无法拥有 除非使用此函数打开XML文件的多个线程 不知何故,这两个线程都受到保护,不会访问 setContent()函数同时使用。
我认为你是对的。
所以为了在我的多线程程序中使用这个功能,在哪里 不止一个线程将打开不同的XML文件,是什么 处理对setContent()函数的访问的最佳方法是什么?我是不是该 在头文件中自己创建一个外部互斥锁,包括在内 每个将访问XML的文件?
同样,我倾向于同意你关于互斥锁。 (顺便说一下,Qt提供了QMutex)但是我不确定你在头文件中使用外部互斥锁是什么意思,所以我只需确保实例化一个互斥锁,然后发送一个指向这个互斥锁是需要它的所有线程。