0

我正在尝试在读取大文件的应用程序中使用多个线程。

我想在主线程中读取文件并将每一行放入一个名为countedAddresses. 我希望多个线程从中挑选行countedAddresses并从中提取所有电子邮件地址,并将它们放在一个名为resolvedAddresses.

目前,如果只有一个resolveAddressThread运行,这一切都有效,但如果我运行两个,我会收到堆损坏错误。

我启动线程:

_beginthread( resolveAddressThread, 0, NULL );
_beginthread( resolveAddressThread, 0, NULL );

这是线程代码:

unsigned int linesCounted, linesResolved, linesProcessed;
std::deque<std::string> countedAddresses;std::deque<std::string> resolvedAddresses;
HANDLE linesCMutex, linesRMutex, linesRCMutex;

void resolveAddressThread(void* pParams)
{ 
string fileLine= "";

while(1)
{
    WaitForSingleObject(linesCMutex, INFINITE);
    WaitForSingleObject(linesRCMutex, INFINITE);
    if (linesCounted>linesResolved)
    {

        if (countedAddresses.size()!=0)
        {
            fileLine = countedAddresses.front();
            countedAddresses.pop_front();
            ReleaseMutex(linesRCMutex);
            ReleaseMutex(linesCMutex);
        }
        else
        {
            ReleaseMutex(linesRCMutex);
            ReleaseMutex(linesCMutex);
            Sleep(1000);

        }
    }
    else
    { cout<<"All lines in the file have been processed."<<endl;
    ReleaseMutex(linesRCMutex);
    ReleaseMutex(linesCMutex);
    break;}


    if (fileLine.length()>1)
    {
        string::iterator strIter;
        string buffer;
        int tabCount=0;
        bool useFlag =false, keepFlag = false, stopFlag = false;
        buffer.clear();
        for(strIter=fileLine.begin(); strIter!=fileLine.end(); ++strIter)
        {
            if (*strIter == '\t')
            {
                ++tabCount;
            }
            if (tabCount == 10)
            {
                if ('\"'== *strIter)
                {
                    useFlag=!useFlag;
                }
                else if (useFlag && *strIter > 0)
                {

                    if (*strIter == '@')
                    {
                        buffer+=*strIter;
                        keepFlag = true;
                    }

                    else if ((*strIter ==' '||*strIter ==';')&& keepFlag)
                    {
                        if (buffer.at(buffer.length()-1)=='.')
                        {buffer = buffer.substr(0, buffer.length() - 1);}

                        WaitForSingleObject(linesRMutex, INFINITE);
                        resolvedAddresses.push_back(buffer);
                        ReleaseMutex(linesRMutex);
                        buffer.clear();
                        keepFlag = false;

                    }
                    else if (*strIter ==' '||*strIter ==';')
                    {
                        buffer.clear();
                        keepFlag = false;
                    }
                    else
                    {
                        buffer+=*strIter;
                    }

                }
            }
            if (tabCount ==11 && keepFlag==true)
            {
                if (buffer.at(buffer.length()-1)=='.')
                {buffer = buffer.substr(0, buffer.length() - 1);}

                WaitForSingleObject(linesRMutex, INFINITE);
                resolvedAddresses.push_back(buffer);
                ReleaseMutex(linesRMutex);
                buffer.clear();
                keepFlag = false;
            }
        }
        WaitForSingleObject(linesRCMutex, INFINITE);
        ++linesResolved;
        ReleaseMutex(linesRCMutex);
        fileLine.clear();
    }
}
}

请让我知道我哪里出错了。

谢谢, 安赫

4

0 回答 0