一个压力测试工具,线程数可控,每个线程中都会对同一个IXMLDOMDocument进行操作,当线程少的时候,比如100个,很少会出现问题,但是当线程数超过200,每次运行很快就会出现异常:
PowerTest_D.exe 中的 0x5880e921 处未处理的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突
产生异常的代码每次都是对某个IXMLDOMNode的调用,比如selectSingleNode或者selectNodes,此时该IXMLDOMNode对象不为空,我认为是MSXML内部出现了问题,请问如何解决这个问题?我的IXMLDOMDocument初始化代码:
MSXML2::IXMLDOMDocumentPtr m_pXmlDoc;
HRESULT hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXmlDoc);
不用CLSID_DOMDocument60改用CLSID_DOMDocument40或CLSID_DOMDocument都是一样的现象。

解决方案 »

  1.   

    如果它自身有这个bug,那么你就要来规避了,比如不开这么多线程
    可以尝试给微软提交bug
      

  2.   

    如果不是必须,可否考虑Cup对XML文件进行操作
      

  3.   

    因为一直使用微软的MSXML,以前的程序线程少,没有出过问题,觉得微软不应该有这样的问题呀
      

  4.   

    专门做了个测试程序,主线程中初始化DOC:#define LPXMLDOC MSXML2::IXMLDOMDocumentPtr
    #define LPXMLELEMENT MSXML2::IXMLDOMElementPtr
    #define LPXMLNODE MSXML2::IXMLDOMNodePtr
    #define LPXMLNODES MSXML2::IXMLDOMNodeListPtr
    #define LPXMLPI MSXML2::IXMLDOMProcessingInstructionPtr
    #define LPXMLCDATA MSXML2::IXMLDOMCDATASectionPtr
    #define LPXMLERROR MSXML2::IXMLDOMParseErrorPtr
    CString strFile = "D:\\Work\\PowerTest\\PowerTest\\Bin\\1.xml";
    HRESULT hr = m_pXmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
    if(hr != S_OK || m_pXmlDoc == NULL)
    return;
    m_pXmlDoc->load(_bstr_t(strFile));然后创建1500个线程,在线程中: HRESULT hr = CoInitialize(NULL);
    if(hr != S_OK)
    {
    AfxMessageBox("COM初始化错误!");
    return FALSE;
    } LPXMLNODE pRootNode = theApp.m_pXmlDoc->selectSingleNode(_bstr_t("PowerTest"));
    LPXMLNODE pSettingNode = pRootNode->selectSingleNode(_bstr_t("BaseSettings"));
    LPXMLNODE pMonitorNode = pSettingNode->selectSingleNode(_bstr_t("Monitor"));
    LPXMLNODE pSessionNode = pMonitorNode->selectSingleNode(_bstr_t("Session"));
    LPXMLNODE pColumnRoot = pSessionNode->selectSingleNode(_bstr_t("ColumnSetting"));
    LPXMLNODES pColumnNodes = pColumnRoot->selectNodes(_bstr_t("Column"));
    long nCount;
    pColumnNodes->get_length(&nCount);
    for(long i=0;i<nCount;i++)
    {
    LPXMLNODE pColumnNode;
    pColumnNodes->get_item(i, &pColumnNode);
      LPXMLELEMENT pColumnElement = pColumnNode;
      _variant_t varName = pColumnElement->getAttribute(_bstr_t("ListColumnName"));
      _variant_t varWidth = pColumnElement->getAttribute(_bstr_t("ListColumnWidth"));
    }然后多次执行,有时就会出现错误,错误位置可能在任何一个XML操作语句