如何使用c ++窗口线程

时间:2012-02-04 15:27:12

标签: c++ visual-c++

我想用多个线程加密文件,以减少所花费的时间。我在intel i5处理器,4 GB内存,visual c ++ 2008上运行。问题是当我在调试模式下运行代码(visual c ++ 2008)时,所用的时间更长,例如,如果我使用一个线程加密3 mb文件,花费的时间是5秒,但是当我使用两个线程时,花费的时间是10秒。在调试模式下使用2个线程时,时间应该很短。但在发布模式下,没有问题,使用多个线程所花费的时间很短。 是否可以在更短的时间内以调试模式运行代码?在visual c ++ 2008中有改变的设置吗?

void load()
{ 
    ifstream readF ("3mb.txt");
    string output; string out;

    if(readF.is_open())
    {
        while(!readF.eof())
        {
            getline(readF,out);
            output=output+'\n'+out;

        }
        readF.close();
        //cout<<output<<endl;
        //cout<<output.size()<<endl;
        text[0]=output;
    }
    else
        cout<<"couldnt open file!"<<endl;
}

unsigned Counter; 
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
    cout<<"encrypting..."<<endl;
    Enc(text[0]);

    _endthreadex( 0 );
    return 0;
} 

unsigned __stdcall SecondThreadFunc2( void* pArguments )
{
    cout<<"encrypting..."<<endl;
    //Enc(text[0]);

    _endthreadex( 0 );
    return 0;
} 

int main()
{ 
    load();
    HANDLE hThread[10];
    unsigned threadID;

    time_t start, end;
    start =time(0);
    hThread[0] = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID);
    hThread[1] = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc2, NULL, 0, &threadID );

    WaitForSingleObject( hThread[0], INFINITE );
    WaitForSingleObject( hThread[1], INFINITE );

    CloseHandle( hThread[0] );
    end=time(0);

    cout<<"Time taken : "<<difftime(end, start) << "second(s)" << endl;

    system("pause");
}

1 个答案:

答案 0 :(得分:0)

可能更慢的一个潜在原因是多个线程需要将数据从内存加载到cpu缓存中。在调试模式下,数据结构周围可能存在额外的填充,旨在捕获缓冲区溢出。这可能意味着当cpu从一个线程切换到另一个线程时,它需要刷新缓存并从ram重新加载所有数据。但是,在没有填充的发布模式下,两个线程的足够数据都适合缓存,因此运行速度更快。

如果添加更多线程,即使在发布模式下,您也会发现添加更多线程会导致收益递减,然后开始变慢,而不是更少的线程。