Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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++;多线程(多线程的Windows实现) 我最近回到C++,开始学习多线程。我有一个小程序,它列出一个路径中的文件,对于每个不是目录的文件,它会将它们添加到列表中。接下来,我创建与CPU数量相同的线程,当一个元素添加到列表中时,其中一个_C++_Windows_Multithreading - Fatal编程技术网

C++;多线程(多线程的Windows实现) 我最近回到C++,开始学习多线程。我有一个小程序,它列出一个路径中的文件,对于每个不是目录的文件,它会将它们添加到列表中。接下来,我创建与CPU数量相同的线程,当一个元素添加到列表中时,其中一个

C++;多线程(多线程的Windows实现) 我最近回到C++,开始学习多线程。我有一个小程序,它列出一个路径中的文件,对于每个不是目录的文件,它会将它们添加到列表中。接下来,我创建与CPU数量相同的线程,当一个元素添加到列表中时,其中一个,c++,windows,multithreading,C++,Windows,Multithreading,C++;多线程(多线程的Windows实现) 我最近回到C++,开始学习多线程。我有一个小程序,它列出一个路径中的文件,对于每个不是目录的文件,它会将它们添加到列表中。接下来,我创建与CPU数量相同的线程,当一个元素添加到列表中时,其中一个线程计算MD5。以下是我的实施,但尚未完全发挥作用,我想了解原因: CRITICAL_SECTION critical_section; std::vector<std::wstring> file_array; HANDLE th

C++;多线程(多线程的Windows实现) 我最近回到C++,开始学习多线程。我有一个小程序,它列出一个路径中的文件,对于每个不是目录的文件,它会将它们添加到列表中。接下来,我创建与CPU数量相同的线程,当一个元素添加到列表中时,其中一个线程计算MD5。以下是我的实施,但尚未完全发挥作用,我想了解原因:

CRITICAL_SECTION critical_section;
std::vector<std::wstring> file_array;
HANDLE thSemaphore;
HANDLE mutex;
int numCPU;
int i = 0;
MD5 md5;

void listFiles(LPCWSTR file){
    WIN32_FIND_DATA file_name;
    wstring convert(file);
    wstring temp = convert + L"\\*";
    LPCWSTR temp_address = temp.c_str();
    HANDLE folder_handle = FindFirstFile(temp_address, &file_name);
    do{
        if (wcscmp(file_name.cFileName, L".") != 0){
            if (wcscmp(file_name.cFileName, L"..") != 0){
                if (file_name.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
                }else{
                    wstring convert_folder(file);
                    wstring temp_folder = convert_folder + L"\\" + file_name.cFileName;
                    LPCWSTR file_path = temp_folder.c_str();
                    WaitForSingleObject(mutex, INFINITE);
                    file_array.push_back(file_path);
                    ReleaseMutex(mutex);
                    ReleaseSemaphore(thSemaphore, 1, NULL);
                }
            }
        }
    } while (FindNextFile(folder_handle, &file_name) != 0);

}


void CalcHash(LPCWSTR file){
    char buffer[1000];
    wcstombs(buffer, file,1000);
    cout << md5.digestFile(buffer)<<"  "<<endl;   //for some reason all the threads stay here without printing until the listfiles function finished.

}

DWORD WINAPI CalcMD5(LPVOID param){
            WaitForSingleObject(thSemaphore, INFINITE);
            if (file_array.size() != 0){
                EnterCriticalSection(&critical_section);
                LPCWSTR file_path = file_array.at(i).c_str();
                i++;
                LeaveCriticalSection(&critical_section);
                CalcHash(file_path);
            }

    return 0;
}

int main(){
    SYSTEM_INFO sysinfo;
    HANDLE threads[13];
    DWORD dwThread[13];
    GetSystemInfo(&sysinfo);
    numCPU = sysinfo.dwNumberOfProcessors;
    LPCWSTR input_file;
    wstring input;
    cout << "Introduceti calea fisierului care trebuie copiat: " << endl;
    wcin >> input;
    input_file = input.c_str();
    mutex = CreateMutex(NULL, FALSE, NULL);
    thSemaphore = CreateSemaphore(NULL, 0, 1000, NULL);
    InitializeCriticalSectionAndSpinCount(&critical_section, 0x1000);
    for (int i = 0; i < numCPU; i++){
        threads[i] = CreateThread(NULL, 0, CalcMD5, NULL, 0, &dwThread[i]);
    }
    listFiles(input_file);

    WaitForMultipleObjects(numCPU, threads, TRUE, INFINITE);
    DeleteCriticalSection(&critical_section);
    for (int i = 0; i < numCPU; i++){
        CloseHandle(threads[i]);
    }
    CloseHandle(mutex);
    cout << numCPU;

    return 0;
}
临界段临界段;
std::矢量文件_数组;
处理信号量;
处理互斥;
int numCPU;
int i=0;
MD5-MD5;
无效列表文件(LPCWSTR文件){
WIN32\u查找\u数据文件\u名称;
wstring转换(文件);
wstring temp=convert+L“\\*”;
LPCWSTR temp_address=temp.c_str();
HANDLE folder\u HANDLE=FindFirstFile(临时地址和文件名);
做{
如果(wcscmp(文件名为“L”。)!=0){
如果(wcscmp(文件名为“.cFileName,L.”))=0){
if(文件名.dwFileAttributes和文件属性目录){
}否则{
wstring convert_文件夹(文件);
wstring temp\u folder=convert\u folder+L“\\”+file\u name.cFileName;
LPCWSTR file_path=temp_folder.c_str();
WaitForSingleObject(互斥,无限);
文件数组。向后推(文件路径);
释放互斥(mutex);
释放信号量(thSemaphore,1,NULL);
}
}
}
}while(FindNextFile(文件夹句柄和文件名)!=0);
}
void CalcHash(LPCWSTR文件){
字符缓冲区[1000];
wcstombs(缓冲区,文件,1000);

CUT使用标准的C++多线程工具。什么是“奇怪的打印”?对于某些指定的输入,期望的和实际的输出是什么?如果你还没有完成,请花一些时间。这不是C++多线程。这是Windows特定的多线程。标题是误导的。<代码> ActudialFieldAcL(&批判节);LPCWSTR file_path=file_array.at(i).c_str();i++;LeaveCriticalSection(&critical_section);
--这其中的巨大缺陷--如果
at()呢抛出异常?你永远不会解锁关键部分。不要这样写同步方法——使用RAI.我打算使用Windows特定的多线程,因此标准C++多线程不是一个OBTY(抱歉的标题,我没有意识到)。奇怪的打印意味着每次我都会得到不同的结果。我已经这样做了,但我第一次这样做的方式并没有真正遵循并行性(我在等待列表填充,然后我在计算md5)。通过使用LeaveCriticalSection,我没有解锁关键部分?