我的多线程代码有问题,希望有人能帮我解决。
我希望在控制台上打印从作为参数给定的文件夹开始的所有文件和文件夹。我将此函数用于枚举:
void enumerate(char* path) {
HANDLE hFind;
WIN32_FIND_DATA data;
char *fullpath = new char[strlen(path) - 1];
strcpy(fullpath, path);
fullpath[strlen(fullpath) - 1] = '\0';
hFind = FindFirstFile(path, &data);
do {
if (hFind != INVALID_HANDLE_VALUE) {
if (strcmp(data.cFileName, ".") != 0 && strcmp(data.cFileName, ".."))
{
EnterCriticalSection(&crit);
queue.push(data.cFileName);
LeaveCriticalSection(&crit);
ReleaseSemaphore(semaphore, 1, NULL);
if (data.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
strcat(fullpath, data.cFileName);
strcat(fullpath, "\\*");
enumerate(fullpath);
}
}
}
} while (FindNextFile(hFind, &data));
FindClose(hFind);
return;
}
当我找到一个文件或文件夹时,我想将其添加到全局队列,并让我的工作线程将其打印到控制台。我的工作线程函数是:
DWORD WINAPI print_queue(LPVOID param) {
while (1) {
WaitForSingleObject(semaphore, INFINITE);
EnterCriticalSection(&crit);
char *rez = queue.front();
queue.pop();
LeaveCriticalSection(&crit);
if (strcmp(rez, "DONE") == 0)
break;
else
std::cout << rez << std::endl;
}
return 1;
}
在里面
main
,我初始化信号量和临界部分,这两个变量都是全局声明的:
semaphore = CreateSemaphore(NULL, 0,1, NULL);
InitializeCriticalSection(&crit);
然后创建4个线程:
thread1 = CreateThread(NULL, 0, print_queue, NULL, 0, &tId1);
thread2 = CreateThread(NULL, 0, print_queue, NULL, 0, &tId2);
thread3 = CreateThread(NULL, 0, print_queue, NULL, 0, &tId3);
thread4 = CreateThread(NULL, 0, print_queue, NULL, 0, &tId4);
然后我打电话给
enumerate()
函数和,用于队列中的字符串,当到达这些字符串时,这些字符串将向我的线程发出停止的信号:
for (int p = 0; p<4; p++)
{
EnterCriticalSection(&crit);
queue.push(done);
LeaveCriticalSection(&crit);
ReleaseSemaphore(semaphore, 1, NULL);
}
这4个字符串是我的线程的停止条件。然后我等待线程:
HANDLE * threadArray = new HANDLE[4];
threadArray[0] = thread1;
threadArray[1] = thread2;
threadArray[2] = thread3;
threadArray[3] = thread4;
WaitForMultipleObjects(4, threadArray, TRUE, INFINITE);
并关闭信号量和临界部分:
CloseHandle(semaphore);
DeleteCriticalSection(&crit);
出于某种原因,输出是随机垃圾,我不知道为什么。
这是一个示例输出:
te(Lâ¤(L
â¤(L
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â °â*â§wM3â§weµFC4
â â â â â
我的逻辑是在0上启动信号量,每当队列上发生操作时,就进入关键部分以保护我的数据,在
枚举()
功能并将其减少
print_queue()
。
可能有什么问题?