我正在尝试在读取大文件的应用程序中使用多个线程。
我想在主线程中读取文件并将每一行放入一个名为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();
}
}
}
请让我知道我哪里出错了。
谢谢, 安赫