Multithreading 如何使用多线程读取大量文件,请帮助我!

Multithreading 如何使用多线程读取大量文件,请帮助我!,multithreading,mfc,Multithreading,Mfc,在我的应用程序中有一小部分函数,它将读取文件以获取一些信息,文件计数的数量至少为50,因此我考虑实现线程。假设用户提供50个文件,我想将其分离为5*10,应创建5个线程,因此,每个线程可以处理10个文件,这可以加快进程。从下面的代码中,您可以看到一些变量是常见的。我阅读了一些关于线程的文章,我知道在MecCriticalStuation只能使用一个线程访问变量/控件。对于我这个初学者,我发现很难理解我所学到的关于线程的知识。有人请给我一些关于下面代码的想法。提前谢谢 file read func

在我的应用程序中有一小部分函数,它将读取文件以获取一些信息,文件计数的数量至少为50,因此我考虑实现线程。假设用户提供50个文件,我想将其分离为5*10,应创建5个线程,因此,每个线程可以处理10个文件,这可以加快进程。从下面的代码中,您可以看到一些变量是常见的。我阅读了一些关于线程的文章,我知道在MecCriticalStuation只能使用一个线程访问变量/控件。对于我这个初学者,我发现很难理解我所学到的关于线程的知识。有人请给我一些关于下面代码的想法。提前谢谢

file read function://
void CMyClass::GetWorkFilesInfo(CStringArray& dataFilesArray,CString* dataFilesB,

                        int* check,DWORD noOfFiles,LPWSTR path)

{
        CString cFilePath;  
    int cIndex =0;
    int exceptionInd = 0;
        wchar_t** filesForWork = new wchar_t*[noOfFiles];
    int tempCheck;
    int localIndex =0;
    for(int index = 0;index < noOfFiles; index++)
    {
        tempCheck = *(check + index);
        if(tempCheck == NOCHECKBOX)
        {
            *(filesForWork+cIndex) = new TCHAR[MAX_PATH];
        wcscpy(*(filesForWork+cIndex),*(dataFilesB +index));
            cIndex++;
        }
        else//CHECKED or UNCHECKED
        {
            dataFilesArray.Add(*(dataFilesB+index));
            *(check + localIndex) = *(check + index);
        localIndex++;

        }

    }
    WorkFiles(&cFilePath,dataFilesArray,filesForWork,
                    path,
                    cIndex);
    dataFilesArray.Add(cFilePath);
    *(check + localIndex) = CHECKED;

}

我认为你最好只使用一个线程来读取所有文件。线程之间的上下文切换以及同步问题在您的示例中确实不值这个价钱。硬盘驱动器是一种资源,因此假设所有五个线程轮流将硬盘驱动器读取头移动到硬盘驱动器上的不同位置==效果不是很好。

您展示的代码根本没有使用线程。您需要澄清您的问题,以显示您如何尝试在多个线程之间分割工作以及出现了什么问题。此外,我建议使用CString而不是原始的wchar_t*和TCHAR*字符串。但是,如果您坚持使用指针,请不要将TCHAR*与wchar\u t*混合使用-您在If语句中将TCHAR*分配给wchar\u t,然后调用wcscpy。这对于Unicode的构建是可行的,但是如果您需要在某个时候构建ASCII,那么这将非常失败。保持一致。考虑到每个线程都会阻止等待磁盘访问,线程之间的上下文切换可以忽略不计。至于读取效率,我认为这取决于访问大小。磁盘不完全轮流运行;操作系统和控制器上都有调度程序。如果所有文件的大小都小于等于4KB,最好创建50个线程,向系统发送大量请求,让磁盘调度器找出如何以最合理的顺序为请求提供服务。我可以同意上下文切换,因为在I/O中花费的时间无论如何会占主导地位,但是我真的不认为让大量线程运行会有任何好处,因为它们都将从当前的内容中读取本质上是一个连续的磁盘。类似于如果你有一个收银员,它不会加快50个队列到该收银员。