0

大きなファイルを読み取るアプリケーションで複数のスレッドを使用しようとしています。

メインスレッドのファイルから読み取り、各行をと呼ばれる両端キューに入れたいと思いますcountedAddresses。複数のスレッドで行を選択countedAddressesし、それらからすべての電子メールアドレスを引き出して、と呼ばれる両端キューに配置する必要がありますresolvedAddresses

現時点では、実行しているのが1つだけの場合はすべて機能しますがresolveAddressThread、2つ実行すると、ヒープ破損エラーが発生します。

次のコマンドでスレッドを起動します。

_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