为什么Win API线程执行函数,而标准线程则没有

Why win api thread executes function, but standard thread does not?

本文关键字:线程 标准 函数 Win API 执行 为什么      更新时间:2023-10-16

我有15个线程,我想执行我按下的10个功能。我不在乎现在保护它,只是想知道为什么Win API执行功能,而STD却没有。

代码或多或少来自手工英雄第123天

struct WorkQueueEntry
{
    char* stringToPrint;
};
static uint32 nextEntryToDo;
static uint32 entryCount;
WorkQueueEntry entries[256];
inline void PushString(const char* string)
{
    WorkQueueEntry* entry = entries + entryCount++;
    entry->stringToPrint = const_cast<char*>(string);
}
struct ThreadInfo
{
    int logicalThreadIndex;
};
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    printf("entry count %i, nextEntryToDo %in", entryCount, nextEntryToDo);
    ThreadInfo* threadInfo = (ThreadInfo*)lpParameter;
    for(;;) {
        if(nextEntryToDo < entryCount) {
            WorkQueueEntry* entry = entries + nextEntryToDo++;
            char buffer[256];
            sprintf_s(buffer, "Thread %u: %s", threadInfo->logicalThreadIndex, entry->stringToPrint);
            printf(buffer);
        }
    }
}

主机中的某个地方

#define WinThread

ThreadInfo threadInfo[5];
    for(int i = 0; i < _ARRAYSIZE(threadInfo); ++i) {
        ThreadInfo* info = threadInfo + i;
        info->logicalThreadIndex = i;
        #ifdef WinThread
        {
            DWORD threadID;
            HANDLE threadHandle = CreateThread(0, 0, ThreadProc, info, 0, &threadID);
            CloseHandle(threadHandle);
        }
        #else
        {
            std::thread t(ThreadProc, info);
            t.join();
        }
        #endif
    }
    PushString("String 0n");
    PushString("String 1n");
    PushString("String 2n");
    PushString("String 3n");
    PushString("String 4n");
    PushString("String 5n");
    PushString("String 6n");
    PushString("String 7n");
    PushString("String 8n");
    PushString("String 9n");

win api线程表明,在应用程序入口的开始时,计数为10,因此if(nextEntryCount < entryCount)是正确的,可以完成Funciton。STD线程在开始时具有输入计数0,因此if(nextEntryCount < entryCount)是不正确的,无法完成功能。

为什么?

在创建STD线程之前,按下字符串将其修复,但并非完全。

现在看起来像这样:

//#define WinThread
PushString("String 0n");
PushString("String 1n");
PushString("String 2n");
PushString("String 3n");
PushString("String 4n");
PushString("String 5n");
PushString("String 6n");
PushString("String 7n");
PushString("String 8n");
PushString("String 9n");
ThreadInfo threadInfo[5];
    for(int i = 0; i < _ARRAYSIZE(threadInfo); ++i) {
        ThreadInfo* info = threadInfo + i;
        info->logicalThreadIndex = i;
        #ifdef WinThread
        {
            DWORD threadID;
            HANDLE threadHandle = CreateThread(0, 0, ThreadProc, info, 0, &threadID);
            CloseHandle(threadHandle);
        }
        #else
        {
            std::thread t(ThreadProc, info);
            t.join();
        }
        #endif
    }

进入计数是乞讨的10,如果(NextEntryCount&lt; entryCount)是正确的,因此可以完成功能,但是它打印了仅通过索引为0的线程完成的工作。

。 。

为什么使用标准线程,只有一个线程完成了所有工作?

t.join()使您阻止t完成。CloseHandle(threadHandle)没有相同的效果(它关闭了手柄,但不等待线程)。

如果您希望std::thread匹配Winapi线程,请在join中所有这些线程中创建所有内容。最简单的解决方案是通过用t.join()替换CC_8。