请告诉我线程有什么问题!

时间:2010-05-11 08:07:32

标签: multithreading mfc

我有一个函数,我将一堆文件压缩成一个压缩文件..这需要很长时间(压缩),所以我尝试在我的应用程序中实现线程...如果我有20个文件用于压缩,我把它分开为5 * 4 = 20,为了做到这一点,我有所有4个线程的单独变量(用于压缩),以避免锁定,我将等到4线程完成..现在..线程正在工作,但我认为它们的性能没有任何改善。通常情况下,实现线程后,20个文件(例如)需要1分钟...只有5或3秒的差异。有时相同。 在这里,我将显示1个线程的代码(因此它适用于其他3个线程)

//main thread   
    myClassObject->thread1 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction1,myClassObject);
    ....

    HANDLE threadHandles[4];
    threadHandles[0] = myClassObject->thread1->m_hThread;
    ....

    WaitForSingleObject(myClassObject->thread1->m_hThread,INFINITE);

UINT MyThreadFunction(LPARAM lparam)
{

    CMerger* myClassObject = (CMerger*)lparam;
    CString outputPath = myClassObject->compressedFilePath.GetAt(0);//contains the o/p path
    wchar_t* compressInputData[] = {myClassObject->thread1outPath,
                    COMPRESS,(wchar_t*)(LPCTSTR)(outputPath)};
    HINSTANCE loadmyDll;
    loadmydll = LoadLibrary(myClassObject->thread1outPath);
    fp_Decompress callCompressAction = NULL;
    int getCompressResult=0;
    myClassObject->MyCompressFunction(compressInputData,loadClient7zdll,callCompressAction,myClassObject->thread1outPath,
                    getCompressResult,minIndex,myClassObject->firstThread,myClassObject);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

首先,您只需等待其中一个主题。我想你想要WaitForMultipleObjects。

至于缺乏加速,您是否认为您的实际瓶颈不是压缩而是文件加载?文件加载速度很慢,争用硬盘时间片的4个线程“可能”甚至导致性能下降。

这就是过早优化是邪恶的原因。您需要再次对个人资料,个人资料和个人资料进行分析,以确定您的真正瓶颈所在。

编辑:除非我看到代码,否则我无法对WaitForMultipleObjects发表评论。我自己从未遇到任何问题...

至于瓶颈。这是一个比喻,如果你试图将大量的液体从圆筒中倒出,将其倒置,然后水以恒定的速率离开。如果你试着用瓶子做这件事,你会注意到它不能那么快。这是因为只有很多液体可以流过瓶子的薄部分(更不用说进入它的空气)。因此,从容器中排出的水的限制受到瓶颈(薄部分)的限制。

在编程时,当你谈论瓶颈时,你正在谈论代码中最慢的部分。在这种情况下,如果您的线程花费大部分时间等待磁盘加载完成,那么您将通过多线程获得非常小的加速,因为您只能立即加载这么多。实际上,当您尝试一次加载4倍时,您将开始发现必须等待加载完成的时间。在你的单线程情况下,你等待,一旦它加载你压缩。在4线程的情况下,您要等待所有负载完成的4倍,然后同时压缩所有4个文件。这就是你加快速度的原因。不幸的是,由于您花费大部分时间等待负载完成,因此您将看不到任何接近4倍速的情况。因此,您的方法的限制因素不是压缩,而是从磁盘加载文件,因此它被称为瓶颈。

Edit2:如果您建议通过消除等待数据从磁盘加载的时间,您会发现最佳加速时间。

1)如果您将文件作为多个磁盘页面加载(通常为2048字节但您可以查询窗口以获得大小),则可以获得最佳的加载性能。如果你加载的尺寸不是这个尺寸的倍数,你将会受到相当严重的性能影响。

2)看看异步加载。例如,在处理文件1时,您可能正在将所有文件2(或更多)加载到内存中。这意味着您不会等待加载完成。尽管如此,你不太可能在这里获得巨大的速度,因为你可能仍然会等待负载。另一件要尝试的是异步加载音频文件的“块”。即:

  • 加载块1.
  • 开始chunk 2 loading。
  • 处理块1.
  • 等待第2块加载。
  • 开始第3组加载。
  • 处理块2.
  • (依此类推)

3)您可以购买更快的磁盘驱动器。