我正在使用boost库来创建使用互斥锁的多线程。我基于谷歌的一些例子。多头工作正常,但CPU为100%,任务管理器的内存使用量为300K +。我的两个多线程函数执行非常高的数据转换和分析。我不确定我是否错过了某些事情。以下是我的多线程的一部分:
wait(1);
mutex.lock();
boost::thread t1(&YExcel::BasicExcelCell::TTiTraceParserConv,c,TTiAsciiTraceOutputDL.GetBuffer(0));
mutex.unlock();
wait(2);
mutex.lock();
boost::thread t2(&YExcel::BasicExcelCell::TTiTraceParserConv,c,TTiAsciiTraceOutputUL.GetBuffer(0));
mutex.unlock();
t1.join();
t2.join();
wait(2);
wait(1);
mutex.lock();
boost::thread t5(&YExcel::BasicExcelCell::UeAndCellParamParseUL,c,TTiAsciiTraceOutputUL.GetBuffer(0), NumOfLinesUL,GHOSTFILTER);
mutex.unlock();
wait(2);
mutex.lock();
boost::thread t6(&YExcel::BasicExcelCell::UeAndCellParamParseDL,c,TTiAsciiTraceOutputDL.GetBuffer(0), NumOfLinesDL);
mutex.unlock();
t5.join();
t6.join();
我需要在这些功能中做些什么吗?提前致谢。我接受了戴尔Optilex 745 Pentium D的测试。我不确定它是否支持多线程。我打印过hard_concurrent,它显示在1。
其中一项功能 - 摘要
int BasicExcelCell::UeAndCellParamParseDL(char *inname, int NumOfRecords)
{
typedef boost::tokenizer <boost::escaped_list_separator<char> > my_tokenizer;
....
....
CString TTiAsciiTraceOutput(inname);
TTiAsciiTraceOutput.Replace(".dat","_raw.txt");
ifstream infile(TTiAsciiTraceOutput.GetBuffer(0));
if (!infile)
{
cout << "Couldn't open file " << TTiAsciiTraceOutput.GetBuffer(0) << " for reading." << endl;
return EXIT_FAILURE;
}
cout << "\nOpened file " << TTiAsciiTraceOutput.GetBuffer(0) << " for reading." << endl << endl;
int lineCount=0;
getline(infile, line);
if (NumOfRecords < 0)
{
cout<<"Number Of Lines to be parsed is not specified!"<<endl;
return 0;
}
while (getline(infile, line) && lineCount <= NumOfRecords)
{
lineCount++;
int FoundCrntiEmpty=0;
my_tokenizer tok(line);
int i = 0;
for (my_tokenizer::iterator it(tok.begin()), end(tok.end()); it != end; ++it)
{
mystr.push_back(*it);
}
int tokcount=0;
int SingleTx=0;
int TxDiv=0;
int tokCountFlag=0;
double MetricCalTemp=0.0;
for (vector < string >::iterator mit(mystr.begin()); mit != mystr.end(); mit++)
{
for (vector < string >::iterator _mit(mystr.begin()); _mit != mystr.end(); _mit++)
{
tokCountFlag++;
if (tokCountFlag==60)
break;//not need to goto the whole iterator
switch (tokCountFlag)
{
case 29:
<<*_mit<<endl;
if (*_mit=="0")
FoundCrntiEmpty=1;
break;
case 58:
//cout<<"Single or Tx " <<*_mit<<endl;
if (*_mit == "0")
SingleTx=1;
else if (*_mit == "1")
TxDiv=1;
break;
}
}
}
}
第一个帖子的另一个简短功能:
void BasicExcelCell::TTiTraceParserConv(char *p_resFile)
{
char ttiTraceParser[512];
char ttiTraceConfig[512];
char cwd[512];
size_t size;
char OrigDLFile[512];
GetModuleFileName(NULL, cwd, 512);
char * CollectTTiTraceAdvance_exe;
CollectTTiTraceAdvance_exe = strstr (cwd,"CollectTTiTraceAdvance.exe");
strncpy (CollectTTiTraceAdvance_exe,"",26);
CString TTiAsciiTraceOutput(p_resFile);
CString ParserExe, TraceConfig;
ParserExe.Format(_T("%s\\BinaryFileParser\\tti_trace_parser_wmp.exe "),cwd);
sprintf(OrigDLFile,"%s",TTiAsciiTraceOutput.GetBuffer(0));
TTiAsciiTraceOutput.Replace(".dat","_raw.txt");
TraceConfig.Format(_T(" %s\\%s %s\\%s"),cwd,OrigDLFile,cwd,TTiAsciiTraceOutput);
cout<<"\n\n****Prepare to generate RawFile!!!"<<endl;
ShellAndWait(ParserExe.GetBuffer(0),TraceConfig.GetBuffer(0),"WAIT",240,1);//4 minutes
ParserExe.ReleaseBuffer(0);
TraceConfig.ReleaseBuffer(0);
}
答案 0 :(得分:1)
这对我来说不合适:
mutex.lock();
boost::thread t6(...);
mutex.unlock();
这仅保护线程的创建不与其他任何内容同时运行,它对该线程执行的操作没有影响。您需要从线程函数中锁定互斥锁以获得任何保护。
此外,正如评论中所指出的,wait
是可疑的,不应该被要求。
最后,你应该(在我看来)不要直接使用mutex.lock / mutex.unlock,因为它容易出错,特别是存在异常。使用由Boost提供的scoped_lock
等RAII工具。
要获取更多信息,您必须向我们展示这些线程功能实际在做什么。