Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;Boost多线程CPU和内存使用缓慢且高-需要帮助_C++_Multithreading_Boost - Fatal编程技术网

C++ c++;Boost多线程CPU和内存使用缓慢且高-需要帮助

C++ c++;Boost多线程CPU和内存使用缓慢且高-需要帮助,c++,multithreading,boost,C++,Multithreading,Boost,我正在使用boost库创建带有互斥的多线程。我基于谷歌的一些例子。多线程工作正常,但CPU为100%,任务管理器的内存使用率为300K+。我的两个多线程函数执行非常高的数据转换和分析。我不确定我是否错过了什么。以下是我的多线程部分: wait(1); mutex.lock(); boost::thread t1(&YExcel::BasicExcelCell::TTiTraceParserConv,c,TTiAsciiTraceOutputDL.GetBuffer(0)); mutex

我正在使用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();
我需要在这些函数中做一些事情吗?提前谢谢。我使用Dell Optilex 745 Pentium D进行了测试。我不确定它是否支持多线程。我打印了硬拷贝,它显示在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;
            }
        } 
       }
 }
int-BasicExcelCell::UeAndCellParamParseDL(char*inname,int-numoRecords)
{
typedef boost::标记器my_标记器;
....
....
CString ttiacitraceoutput(inname);
TTIASCITraceOutput.Replace(“.dat”,“_raw.txt”);
ifstream infile(ttiacitraceoutput.GetBuffer(0));
如果(!infle)
{

cout这在我看来不太合适:

mutex.lock();
boost::thread t6(...);
mutex.unlock();
这只会保护线程的创建不会与任何其他线程同时运行,对该线程执行的操作没有影响。您需要在线程函数中锁定互斥锁以获得任何保护

此外,正如评论中指出的那样,
wait
s是可疑的,不需要

最后,在我看来,您不应该直接使用mutex.lock/mutex.unlock,因为它容易出错,特别是在存在异常的情况下。请使用Boost提供的RAII工具,如
scoped_lock


要获得更多信息,您必须向我们展示这些线程函数实际上在做什么。

我觉得这不太合适:

mutex.lock();
boost::thread t6(...);
mutex.unlock();
这只会保护线程的创建不会与任何其他线程同时运行,对该线程执行的操作没有影响。您需要在线程函数中锁定互斥锁以获得任何保护

此外,正如评论中指出的那样,
wait
s是可疑的,不需要

最后,在我看来,您不应该直接使用mutex.lock/mutex.unlock,因为它容易出错,特别是在存在异常的情况下。请使用Boost提供的RAII工具,如
scoped_lock


要获得更多信息,您必须向我们展示这些线程函数实际在做什么。

但CPU是100%
。恭喜,它工作正常。每当我看到
wait()时,我都会感到担心
多线程程序中的调用;这些调用是为了您自己的教育,还是因为它们是程序正确执行所必需的?此外,还取决于您使用
互斥锁.lock()和
解锁()的方式
调用时,我感觉您也没有正确地锁定数据。我强烈建议您尝试一些,以获得连贯的线程从头到尾视图。(我不能说这段代码是错误的,但它看起来不正确。)是
CString
MFC吗?我认为您使用的
GetBuffer
太多了,它很容易出错,而且只有在修改内容时才需要。请尝试简单的隐式或显式
(const char*)
cast-first。另外,为了与STL和Boost保持一致,并且为了便于一般移植,我更喜欢
std::string
。既然您已经在使用Boost,那么看看
Boost\u FOREACH
,您可以使循环和数组访问更清晰。如果您更好地使用
const
,例如,在
UeAndCellParamPar>的参数中seDL
您将能够更自然地使用
std::string
CString
,而无需强制转换或
GetBuffer
但是CPU是100%
。恭喜,它工作了。每当我看到
等待()
多线程程序中的调用;这些调用是为了您自己的教育,还是因为它们是程序正确执行所必需的?此外,还取决于您使用
互斥锁.lock()和
解锁()的方式
调用时,我感觉您也没有正确地锁定数据。我强烈建议您尝试一些,以获得连贯的线程从头到尾视图。(我不能说这段代码是错误的,但它看起来不正确。)是
CString
MFC吗?我认为您使用的
GetBuffer
太多了,它很容易出错,而且只有在修改内容时才需要。请尝试简单的隐式或显式
(const char*)
cast-first。另外,为了与STL和Boost保持一致,并且为了便于一般移植,我更喜欢
std::string
。既然您已经在使用Boost,那么看看
Boost\u FOREACH
,您可以使循环和数组访问更清晰。如果您更好地使用
const
,例如,在
UeAndCellParamPar>的参数中seDL
您将能够更自然地使用
std::string
CString
,而无需强制转换或
GetBuffer
。第一次使用多线程,至少幸运的是:-)我完全同意所有“它看起来也不适合我”。对于互斥体,我只是放在那里看看它的行为。我将在主帖子上发布我的部分函数。感谢所有的评论。同时,我将阅读线程手册。再次感谢。我看到了一些潜在问题。看起来
mystr
是类成员,并且所有线程都运行同一类实例的方法。a从多个线程访问的任何类成员都是潜在的问题。此外,从多个线程打开的文件可能会导致问题,但在不知道各个参数使用了哪些值的情况下,我无法判断是否发生了这种情况。如果线程之间没有共享任何内容,或者所有线程都会严格对待共享数据只读,则不需要互斥锁。文件也是如此,只要每个互斥锁