C++ Tinyxml多任务

C++ Tinyxml多任务,c++,xml,multithreading,oop,tinyxml,C++,Xml,Multithreading,Oop,Tinyxml,我有一个xml文件,程序的每个新线程(BHO)都使用相同的Tinyxml文件 每次在程序中打开新窗口时,它都会运行以下代码: const char * xmlFileName = "C:\\browsarityXml.xml"; TiXmlDocument doc(xmlFileName); doc.LoadFile(); //some new lines in the xml.. and than save: doc.SaveFile(xmlFileName); 问题是,在第一个窗口向xml

我有一个xml文件,程序的每个新线程(BHO)都使用相同的Tinyxml文件

每次在程序中打开新窗口时,它都会运行以下代码:

const char * xmlFileName = "C:\\browsarityXml.xml";
TiXmlDocument doc(xmlFileName);
doc.LoadFile();
//some new lines in the xml.. and than save:
doc.SaveFile(xmlFileName);
问题是,在第一个窗口向xml添加新数据并保存后,下一个窗口将无法添加数据。虽然下一个可以读取xml中的数据,但它不能写入

我考虑了两种可行的方法,但我不知道如何实施:

  • 当我处理完文档对象后,销毁它
  • Tinyxml库中的某些函数用于卸载文件
  • 对这个问题的任何帮助或更好的理解都将是巨大的。
    谢谢。

    根据评论更新(放弃以前的答案):

    好的,我在TinyXml文档中没有看到多少内容告诉我们如何在不限制其他线程的情况下打开文档

    在这种情况下,您应该只向
    TiXmlDocument
    声明一个实例,并在线程之间共享它。每当线程写入文件时,它将进入一个关键部分,写入它需要写入的内容,保存文件,然后退出该关键部分

    我看不到其他解决办法

    根据评论更新:
    因为您使用的是MFC线程,所以代码应该如下所示:

    class SafeTinyXmlDocWrapper
    {
    private:
        static bool m_isAlive = FALSE;
        static CCriticalSection m_criticalSection;
        char* m_xmlFileName;
        TiXmlDocument m_doc;
    
    public:
    
        SafeTinyXmlDocWrapper()
        {
            m_xmlFileName = "C:\\browsarityXml.xml";
            m_doc = TiXmlDocument(m_xmlFileName);
            m_doc.LoadFile();
            m_isAlive = TRUE;
        }
    
        ~SafeTinyXmlDocWrapper()
        {
            CSingleLock lock(&m_criticalSection);
            lock.Lock(); // only one thread can lock
    
            m_isAlive = FALSE;
    
            // cleanup and dispose of the document
    
            lock.Unlock();
        }
    
        void WriteBatch(BatchJob& job)
        {
            CSingleLock lock(&m_criticalSection);
            lock.Lock(); // only one thread can lock
            if(m_isAlive) // extra protection in case the destructor was called
            {
                // write the batch job to the xml document
    
                // save the xml document
                m_doc.SaveFile(m_xmlFileName);
            }
            lock.Unlock(); // the thread unlocks once it's done
        }
    }
    

    我现在还没有写C++,但应该大致是你所要找的。铃铛和口哨额外收费:)。

    我的问题是,我该如何清理?我认为在这种情况下,更好的做法是在线程之间共享XML文档,并从每个线程向其发送批处理作业。批处理作业将写入xml文件并保存在锁/关键部分下。线程间共享对象还不在我的编程级别,但我会尝试。谢谢。我认为这个案例很简单,它应该是一个简单又好的学习例子。代码中使用了哪些线程:pthreads、MFC线程、boost线程?MFC线程。。我正在做一个BHO(浏览器辅助对象)-IE附加组件。